Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.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
在MATLAB/Python中通过优化多个变量来减少两个图之间的差异?_Python_Matlab_Optimization_Curve Fitting_Levenberg Marquardt - Fatal编程技术网

在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中,你应该要么使用优化工具箱,要么使用曲线拟合

假设‘h’是x,y,z和t的函数,它给我们一条图线(t,h)(模拟)。同时,我们还观察到了图(h对t的观察值)。如何通过优化x、y和z的值来减少观测(t,h)图和模拟(t,h)图之间的差异?我想更改模拟图,使其在MATLAB/Python中模拟的图形越来越接近观察到的图形。在文献中,我读到人们用拉文伯格-马夸特算法做了同样的事情,但不知道怎么做?

你实际上是在尝试拟合参数化函数的参数
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)