Python 拟合微分方程:曲线拟合收敛到局部极小值
我试图通过改变a和b来拟合微分方程ay'+by'=0到曲线。下面的代码不起作用。曲线拟合的问题似乎是缺少初始猜测导致拟合失败。我也试过leastsq。有人能给我推荐其他方法来拟合这样的微分方程吗?如果我没有好的猜测曲线拟合失败Python 拟合微分方程:曲线拟合收敛到局部极小值,python,numpy,matplotlib,scipy,Python,Numpy,Matplotlib,Scipy,我试图通过改变a和b来拟合微分方程ay'+by'=0到曲线。下面的代码不起作用。曲线拟合的问题似乎是缺少初始猜测导致拟合失败。我也试过leastsq。有人能给我推荐其他方法来拟合这样的微分方程吗?如果我没有好的猜测曲线拟合失败 from scipy.integrate import odeint from scipy.optimize import curve_fit from numpy import linspace, random, array time = linspace(0.0,1
from scipy.integrate import odeint
from scipy.optimize import curve_fit
from numpy import linspace, random, array
time = linspace(0.0,10.0,100)
def deriv(time,a,b):
dy=lambda y,t : array([ y[1], a*y[0]+b*y[1] ])
yinit = array([0.0005,0.2]) # initial values
Y=odeint(dy,yinit,time)
return Y[:,0]
z = deriv(time, 2, 0.1)
zn = z + 0.1*random.normal(size=len(time))
popt, pcov = curve_fit(deriv, time, zn)
print popt # it only outputs the initial values of a, b!
让我们重写等式:
ay' + by''=0
y'' = -a/b*y'
所以这个方程可以这样表示
dy/dt = y'
d(y')/dt = -a/b*y'
Python 2.7中的代码:
from scipy.integrate import odeint
from pylab import *
a = -2
b = -0.1
def deriv(Y,t):
'''Get the derivatives of Y at the time moment t
Y = [y, y' ]'''
return array([ Y[1], -a/b*Y[1] ])
time = linspace(0.0,1.0,1000)
yinit = array([0.0005,0.2]) # initial values
y = odeint(deriv,yinit,time)
figure()
plot(time,y[:,0])
xlabel('t')
ylabel('y')
show()
您可以将结果图与中的图进行比较,如果您的问题是默认的初始猜测,请阅读文档,了解如何通过为其指定
p0
参数来手动指定它们。例如,curve_fit(deriv,time,zn,p0=(12,0.23))
如果您希望a=12
和b=0.23
作为初始猜测。在开始回答此问题之前,请接受您前面问题中的答案(答案左侧绿色勾选)。@ovgolovin感谢您的建议。我拥有的是一组随时间变化的数字。我想知道这个微分方程的解是否可以用来拟合数据。有什么原因不能只用这个微分方程的闭式解吗?你说的“它不起作用”是什么意思?上述代码正确打印了[1.99997875 0.10001344]
哪些参数确实是安装的数据zn
中的参数?@pappu您能将此注释添加到问题中吗?因为问题不清楚。我得到的是“我能做的就是用odeint解方程并绘制它的图。”@pappu还有,你想拟合的曲线是如何设置的?请在问题中提供这些信息。@pappu您要问的是曲线拟合。这些任务是用机器学习方法解决的,它们不是微不足道的。例如,接近目标曲线的标准是什么?随着标准的变化,合成曲线将随着well@pappu第一个想法是实现h
函数,该函数计算两条曲线之间的接近度。通过改变a
和b
可以通过求解微分方程得到不同的曲线,从而得到h
函数返回的不同值。然后,使用不同的优化算法(例如梯度下降等),您可以找到a
和b
,从而最小化h
输出。那些a
和b
将给出最接近目标曲线的函数h
。我已经检查过了。如果我没有好的猜测曲线拟合失败!