如何将派生作为“中的边界”scipy.optimize.curve\u fit曲线拟合"

2024-04-25 21:36:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图得到函数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]))

我的实际问题是,函数最终有点摇摆。plot of function

由于这种行为,我得到两个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

Tags: 函数代码importdfreturnosdefnp