Python的Matlab拟合非线性最小二乘法

2024-10-02 20:34:52 发布

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

我重写了用Matlab为Python编写的代码,但无法正确解析Python中的fit函数。 Matlab中的代码:

y = *Array 361x1*;
x = *Array 361x1*;
y1 = *Single value 1x1*;
x1 = *Single value 1x1*;

fo = fitoptions('Method','NonlinearLeastSquares','Lower',[-Inf,-Inf],'Upper',[Inf, Inf],'Startpoint',[0.0,0.0]);

ft = fittype( @(A,B, x) A.*x.^2 + B.*x + y1 - A.*x1.^2 - B.*x1, 'independent','x','dependent','y','options',fo);

[fitobject,gof,out] = fit(x,y,ft);

A = fitobject.A;
B = fitobject.B;

我通过Scipy最小二乘法并基于this article在Python中尝试了该解决方案。我编写了以下代码:

ft = least_squares(lambda coeffs: coeffs[0]*x**2 + coeffs[1]*x + y1 - coeffs[0]*x1**2 - coeffs[1]*x1, [0, 0], bounds=([-np.inf, -np.inf], [np.inf, np.inf]))
print(ft('x'))

显然这是不正确的(Python代码中没有考虑数组y),我得到了系数A和B的不同值。我已经尝试了不同的函数,如曲线%拟合等,但没有结果


Tags: 函数代码valuenparrayfitinfx1
1条回答
网友
1楼 · 发布于 2024-10-02 20:34:52

您可以使用scipy.optimize的curve_fit。假设xy是包含数据的numpy.ndarray:

from scipy.optimize import curve_fit

def fitme(x, *coeffs_and_args):
    A, B, x1, y1 = coeffs_and_args
    return A*x**2 + B*x + y1 - A*x1**2 - B*x1 

popt, pcov = curve_fit(lambda  x, A, B: fitme(x, A, B, x1, y1), x, y)

然后数组popt包含参数的最佳值和pcov的估计协方差

相关问题 更多 >