在SciPy中求解方程组

时间:2017-12-05 17:13:43

标签: python scipy exponential

我试图通过三个给定的点拟合指数曲线。但我只得到fsolve或实际0的非常错误的结果。我需要这个为我的学士论文所以如果有人知道更好的解决方案的问题,那么告诉我这个解决方案会非常友好。

from numpy import *
from scipy.optimize import *

def myFunction(variables):
    x1 = 1
    y1 = 100
    x2 = 5
    y2 = 50
    x3 = 10
    y3 = 1
    (a,k,b) = variables

    y1 = a*exp(-x1*k)+b
    y2 = a*exp(-x2*k)+b
    y3 = a*exp(-x3*k)+b
    #0 = a*k**2 * exp(-x1+k)
    return ([a, k, b])

z = fsolve(myFunction,(1,0.1,5))
print(z)

这是我的问题,我需要通过这3个给定点来拟合e函数,此外,forumla的第二个推导应该是0

编辑:06.12.17 在某种程度上,我现在有一个多项式的改进,但并不像它应该的那样。 第二个最大值不应该在那里..:D

from numpy import *
from scipy.optimize import *
import matplotlib.pyplot as plt

def myFunction(z):
    a = z[0]
    b = z[1]
    c = z[2]
    d = z[3]
    e = z[4]
    f = z[5]
    g = z[6]

    x = [0, 10 ,15 ,20 ,50 ,100]
    y = [10 ,90 ,100 ,90 ,50 ,10]
    s = [0, 10, 1, 0, 0, 0]

    F = empty((8))
    F[0] = a*x[0]**6 + b*x[0]**5 + c*x[0]**4 + d*x[0]**3 + e*x[0]**2 + f*x[0]**1 + g - y[0]
    F[1] = a*x[1]**6 + b*x[1]**5 + c*x[1]**4 + d*x[1]**3 + e*x[1]**2 + f*x[1]**1 + g - y[1]
    F[2] = a*x[2]**6 + b*x[2]**5 + c*x[2]**4 + d*x[2]**3 + e*x[2]**2 + f*x[2]**1 + g - y[2]
    F[3] = a*x[3]**6 + b*x[3]**5 + c*x[3]**4 + d*x[3]**3 + e*x[3]**2 + f*x[3]**1 + g - y[3]
    F[4] = a*x[4]**6 + b*x[4]**5 + c*x[4]**4 + d*x[4]**3 + e*x[4]**2 + f*x[4]**1 + g - y[4]
    F[5] = a*x[5]**6 + b*x[5]**5 + c*x[5]**4 + d*x[5]**3 + e*x[5]**2 + f*x[5]**1 + g - y[5]
    F[6] = 6*a*x[3]**5 + 5*b*x[3]**4 + 4*c*x[3]**3 + 3*d*x[3]**2 + 2*e*x[3]**1 + f - s[3]
    F[7] = 6*a*x[5]**5 + 5*b*x[5]**4 + 4*c*x[5]**3 + 3*d*x[5]**2 + 2*e*x[5]**1 + f - s[5]
    return F

zGuess = array([1,1,1,1,1,1,1,1])
z = fsolve(myFunction,zGuess)
print(z)
x_axis = linspace(0,100,100)

y_axis = z[0]*x_axis**6 + z[1]*x_axis**5 + z[2]*x_axis**4 + z[3]*x_axis**3 + z[4]*x_axis**2 + z[5]*x_axis**1 + z[6]
plt.plot(x_axis, y_axis)
plt.show()

编辑07.12.17 整个信号应该看起来像第二个例子的数据。但困难在于第一个例子的部分。我的建议是使用2个多项式,但我的教授更喜欢多项式x <20和e函数x> 20。两者的重叠也应该非常顺利。

1 个答案:

答案 0 :(得分:1)

好的fsolve找到一个函数的根,并没有真正做到非线性拟合。我必须承认,我实际上并没有通过您的代码获得您想要实现的目标。如果你想做一个非线性拟合(因为你在这里谈论指数函数),你可能想在这里检查我的笔记本https://github.com/michelucci/Regression-with-Python/blob/master/(Non)%20linear%20fit%20in%20Python.ipynb,我希望能指出你正确的方向。它首先包含线性回归,然后是非线性教程。

您可以在scipy.optimize库中查看curve_fit() python函数。这应该可以帮助你做你想做的事。

如果有帮助,请告诉我。

您可能还想查看此链接,以便更好地了解非线性拟合https://en.wikipedia.org/wiki/Nonlinear_regression

最好,翁贝托