2017-06-06 82 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

を解決することしかし、私は考え一般化された形式で結果を得たい私との関係を同一視しようとすると、データセットに基づいて、関数x3 = f(x1、x2)は変化する可能性があり、すべての場合について固定式ではない。

答えて

0

許容されるフィット結果を得るための非常に良いアプローチは、フリーパラメータの初期推測の使用です。 curve_fitp0引数をとります。データが2つのデータセットの間であまり変化しない場合は、これが適切な方法である必要があります。私の経験では、良いスタート値を推測する余裕があれば、とし、パラメータをboundsに設定するのが良い方法です。そうでなければ、数学的関係を知らなくてもデータを補間しようとすることができます。

関連する問題