我试图得到函数p(T,x)的系数。我通过panda从excel表格中提供了p、T和x的数据。下面的代码对我来说非常好:
import pandas as pd
import os
from scipy.optimize import curve_fit
import numpy as np
df = pd.read_excel(os.path.join(os.path.dirname(__file__), "./Data.xlsx"))
T = np.array(df['T'], dtype=float)
x = np.array(df['x'], dtype=float)
p = np.array(df['p'], dtype=float)
p_s = 67.17
def func(X, a, b, c, d, e, f):
T, x = X
return x * p_s + x * (1 - x) * (a + b * T + c * T ** 2 + d * x + e * x * T + f * x * T ** 2) * p_s
popt, pcov = curve_fit(func, (T, x), p)
print("a = %s , b = %s, c = %s, d = %s, e = %s, f = %s" % (popt[0], popt[1], popt[2], popt[3], popt[4], popt[5]))
由于这种行为,我得到两个x
值作为一个p
值,这是我不想要的。
为了避免这个小小的摆动,我想为拟合建立一个边界条件,比如dp/dx (for constant T) > 0
。对于dp/dx
,我指的是x
之后函数的推导。你知道吗
这在正常的bound
参数curve_fit
下可能吗?我该怎么做?你知道吗
编辑:
正如我所说的,我对least_square
函数有点搞砸了,但我想我已经到了一个不能真正理解我在做什么或必须做什么的地步。你知道吗
T = np.array(df['T'], dtype=float)
x = np.array(df['x'], dtype=float)
p = np.array(df['p'], dtype=float)
p_s = 67
def f(X, z):
T, x = X
return x * p_s + x * (1 - x) * (z[0] + z[1] * T + z[2] * T ** 2 + z[3] * x + z[4] * x * T + z[5] * x * T ** 2) * p_s
def g(X,p,z):
return p - f(X ,z)
z0 = np.array([0,0,0,0,0,0], dtype=float)
res, flag = least_squares(g,z0, args=(T,x,p))
print(res)
使用此代码,我得到以下错误:
TypeError: g() takes 3 positional arguments but 4 were given
目前没有回答
相关问题 更多 >
编程相关推荐