2017-06-06 85 views
0

我是新来的分析,我正在寻找一个解决方案找到一个模型来解决非线性方程的形式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)可以改变,对于所有情况它不是一个固定的方程。

回答

0

获得可接受的拟合结果的一个非常好的方法是使用初始猜测的自由参数。 curve_fit需要一个p0的说法。如果你的数据在两个数据集之间变化不大,这应该是一个正确的方法。根据我的经验,采取一些负担来猜测良好的起始值p0并通过参数bounds设置限制是一个好方法。否则,如果你不需要知道数学关系,你可以尝试插入数据。