[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

函数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)?

回复 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

评分人数

    • Liule: 乐于助人技术 + 1
From zero to one!

TOP

谢谢,但你的结果和真实值[1584.427,-587474,1810,-203.3164,0.09271]有点差距,能否再改进一下?

TOP

根据计算结果缩小(a, b, c, d, f)各自的bound,直至f(x)的数值足够小(精度足够高)。
1

评分人数

    • Liule: 乐于助人技术 + 1
From zero to one!

TOP

返回列表