找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 15147|回复: 3

[问题求助] [已解决]python多参数拟合

[复制链接]
发表于 2020-7-16 12:30:35 | 显示全部楼层 |阅读模式
函数z=(a*(y+273.15)+b+cx+d*(y+273.15)*LN(y+273.15)+e*(y+273.15)^2)/(8.3144*(y+273.15)*LN(10)), 现在有一些(x, y, z)的数据点(见附件),怎样拟合出最佳的参数 (a, b, c, d, e)?
发表于 2020-7-16 15:37:41 | 显示全部楼层
回复 1# Liule
#!/usr/bin/env python3
from scipy.optimize import differential_evolution
from math import log
from math import e
import numpy as np

data = """1.0       300     -35.287
1.5     315     -34.047
2.0     330     -32.872
2.5     345     -31.757
====copy your data=====
5.0     880     -12.729
5.0     890     -12.547
5.0     900     -12.369"""

data = data.split("\n")
data = list(map(lambda x: filter(None, x.split(" ")), data))
data = map(lambda x: list(map(float, x)), data)
data = list(data)

def f(x, y, a, b, c, d, f):
    return (a * (y + 273.15) + b + c * x + d * (y + 273.15) * np.log(y+273.15) \
            + f * ((y+273.15) ** 2)) / (8.3144 * (y + 273.15) * log(10,e))

def fitness(parameters):
    error = 0
    for x, y, z in data:
        res = f(x, y, *parameters)
        error += abs(res - z) ** 2
    return error

from scipy.optimize import differential_evolution
bounds = [(-500000, 500000)] * 5
x = differential_evolution(fitness, bounds, disp=True).x
print(list(x))

评分

参与人数 1技术 +1 收起 理由
Liule + 1 乐于助人

查看全部评分

 楼主| 发表于 2020-7-16 15:44:35 | 显示全部楼层
谢谢,但你的结果和真实值[1584.427,-587474,1810,-203.3164,0.09271]有点差距,能否再改进一下?
发表于 2020-7-16 17:42:39 | 显示全部楼层
根据计算结果缩小(a, b, c, d, f)各自的bound,直至f(x)的数值足够小(精度足够高)。

评分

参与人数 1技术 +1 收起 理由
Liule + 1 乐于助人

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-16 22:23 , Processed in 0.019932 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表