在MATLAB/Python中通过优化多个变量来减少两个图之间的差异?
假设‘h’是x,y,z和t的函数,它给我们一条图线(t,h)(模拟)。同时,我们还观察到了图(h对t的观察值)。如何通过优化x、y和z的值来减少观测(t,h)图和模拟(t,h)图之间的差异?我想更改模拟图,使其在MATLAB/Python中模拟的图形越来越接近观察到的图形。在文献中,我读到人们用拉文伯格-马夸特算法做了同样的事情,但不知道怎么做?你实际上是在尝试拟合参数化函数的参数在MATLAB/Python中通过优化多个变量来减少两个图之间的差异?,python,matlab,optimization,curve-fitting,levenberg-marquardt,Python,Matlab,Optimization,Curve Fitting,Levenberg Marquardt,假设‘h’是x,y,z和t的函数,它给我们一条图线(t,h)(模拟)。同时,我们还观察到了图(h对t的观察值)。如何通过优化x、y和z的值来减少观测(t,h)图和模拟(t,h)图之间的差异?我想更改模拟图,使其在MATLAB/Python中模拟的图形越来越接近观察到的图形。在文献中,我读到人们用拉文伯格-马夸特算法做了同样的事情,但不知道怎么做?你实际上是在尝试拟合参数化函数的参数x,y,zh(x,y,z;t) MATLAB 你是对的,在MATLAB中,你应该要么使用优化工具箱,要么使用曲线拟合
x,y,z
h(x,y,z;t)
MATLAB
你是对的,在MATLAB中,你应该要么使用优化工具箱,要么使用曲线拟合工具箱(我更喜欢后者)
查看lsqcurvefit
的文档:
x = lsqcurvefit(fun,x0,xdata,ydata);
它在文档中表示,您有一个带有系数x
和采样点xdata
的模型F(x,xdata)
,以及一组测量值ydata
。函数返回最小二乘参数集x
,使用该参数,函数与测量值最接近
拟合算法通常需要起点,一些实现可以随机选择,在lsqcurvefit
的情况下,这就是x0
的目的。如果你有
h = @(x,y,z,t) ... %// actual function here
t_meas = ... %// actual measured times here
h_meas = ... %// actual measured data here
然后在lsqcurvefit
的约定中
fun <--> @(params,t) h(params(1),params(2),params(3),t)
x0 <--> starting guess for [x,y,z]: [x0,y0,z0]
xdata <--> t_meas
ydata <--> h_meas
python 在python中,您必须使用
scipy.optimize
模块,尤其是类似的模块。根据上述惯例,您需要遵循以下原则:
import scipy.optimize as opt
popt,pcov = opt.curve_fit(lambda t,x,y,z: h(x,y,z,t), t_meas, y_meas, p0=[x0,y0,z0])
请注意,p0
起始数组是可选的,但如果缺少,则所有参数都将设置为1。您需要的结果是popt
数组,其中包含[x,y,z]
的最佳值:
x,y,z = popt
h_fit = h(x,y,z,t_meas)
你所说的函数的“图形”到底是什么意思?我发现你的问题很不清楚。@AndrasDeak通过图形我的意思是我们绘制模拟和观察的h值与t值。函数“h”的公式中也有x、y、z变量,我们希望对其进行优化,使模拟变得(尽可能接近)与观察到的相似。我修改了我的问题。也许这有助于你们理解这个问题。如果使用MATLAB的
lsqcurvefit
函数,我的“x”和“扩展数据”是什么。我可以理解“ydata”将是观察数据的“h”值,但如果必须使用它,我无法区分lsqcurvefit
函数的“x”和“xdata”。我将一个名为“h”的单独函数文件定义为function[output]=h(第t段);x=第(1)款;y=第(2)款;z=第(3)款;输出=_公式和x,y,z&t;产出;结束
,然后我创建了另一个文件,在该文件中我创建了observed
和t
向量,它们的长度与“output”的长度相同,并且向量initial=[1 2 3]
。然后我使用lsqcurvefit作为newpara=lsqcurvefit(@h,initial,t,observed)
但通过运行它,MATLAB会说“由于没有足够的输入参数,使用h
时出错”。我必须在函数的“h”文件中定义t
,尽管我在另一个文件中定义了它,在该文件中我调用了lsqcurvefit
,同时给出了h
的样本/观察数据,t也在函数的输入参数中文件h
。这一点我无法理解,当我将文件“h”作为输入参数时,为什么我必须在文件“h”中显式定义t
。@AtherCheema我无法重现您的问题。通过使用匿名函数,这不会产生错误:initial=[1 2 3];t=1:10;观察值=-2*t;h=@(第,t)段第(1)段*t+第(2)段)*(-t)+第(3)段*t.^2;newpara=lsqcurvefit(h,初始值,t,观察值)
。如果改为使用命名函数,那么在调用lsqcurvefit
时确实应该使用@h
,否则它的工作方式应该相同。您的函数名是否与工作区中的其他函数/变量相混淆?这是一个非常简短(而且不好)的函数名…@AndrasDeak,非常感谢。我只是想知道使用lsqcurvefit
和fminbnd
将rmse用作要减少的函数之间有什么区别lsqcurvefit
还可以减少样本数据和计算数据之间的误差平方和。我尝试了这两种方法,它们给出了非常不同的优化值,具有相同的拟合度。@AtherCheema你真的对它们做了完全相同的事情吗?相同的公差水平,相同的起点?无论如何,他们仍然可能在幕后使用不同的算法,因此对于具有多种可能解决方案的问题,您可能会得到截然不同的结果。否则,我对这些函数并不十分熟悉,但它们都可以用于执行曲线拟合(但我会使用名称中带有“curvefit”的函数),这听起来很合理。
x,y,z = popt
h_fit = h(x,y,z,t_meas)