我是新来的分析,我正在寻找一个解决方案找到一个模型来解决非线性方程的形式Y=a(X1^b) + c(X2^d) + e
(其中X1,X2是自变量) 下面是一个完整的集合,不幸的是我们没有太多的观察,我们需要的只是任何简单的拟合。但是这些数据没有任何异常值,每个观测值都必须考虑。寻找非线性方程python scipy
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
import numpy as np
import sympy as sym
x1=np.array([217,160,97,75])
x2=np.array([5.319751464,6.88536761,5.319751464,5.319751464])
x3=np.array([143.420635344,36.7384534912,23.420635344,1.420635344])
y=np.array([14,7,7,1])
def func(X, a, b, c ,d , e):
x1,x2 = X
return a*x1**b + c*x2**d + e
popt, pcov = curve_fit(func, (x1,x2), y)
plt.plot(y, func((x1,x2), *popt), label="Fitted Curve")
plt.legend(loc='upper left')
plt.show()
但运行curve_fit给我的错误,指出该
TypeError: Improper input: N=5 must not exceed M=4
然后我不得不添加一些更多的虚拟输入,添加这导致错误小数点差几乎相同值的观察
x1=np.array([217,160,97,75,76,219])
x2=np.array([5.319751464,6.88536761,5.319751464,5.319751464,5.319751464,5.319751464])
x3=np.array([143.420635344,36.7384534912,23.420635344,1.420635344,1.420635344,143.420635344])
y=np.array([14,7,7,1,1,14])
RuntimeError: Optimal parameters not found: Number of calls to function has reached maxfev = 1200.
然后我不得不删除变量d并保留函数为
def func(X, a, b, c ,e):
x1,x2 = X
return a*x1**b + c*x2 + e
最后它没有运行,但再次与下面的警告,但效果并不好
RuntimeWarning: overflow encountered in power
注意
x3 = max(x2 - {(x1^2)*2.6},0)
和解决
y=a*(x3^b) gives a=0.89 and b=0.58 with r2=0.98 and error=0.19 which is the best one i could get so far
但我会喜欢以广义形式得到结果w没有我试图等同于一个关系。由于基于数据集,函数x3 = f(x1,x2)可以改变,对于所有情况它不是一个固定的方程。