Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 拟合微分方程:曲线拟合收敛到局部极小值_Python_Numpy_Matplotlib_Scipy - Fatal编程技术网

Python 拟合微分方程:曲线拟合收敛到局部极小值

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

我试图通过改变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,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
。我已经检查过了。如果我没有好的猜测曲线拟合失败!