首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >通过在MATLAB/Python中优化多个变量来减少两个图之间的差异?

通过在MATLAB/Python中优化多个变量来减少两个图之间的差异?
EN

Stack Overflow用户
提问于 2016-03-09 21:30:07
回答 1查看 1.8K关注 0票数 1

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-10 12:02:14

实际上,您正在尝试拟合参数化函数x,y,z的参数h(x,y,z;t)

MATLAB

在MATLAB中,您应该使用优化工具箱的lsqcurvefit,或者曲线拟合工具箱的fit (我更喜欢后者)。

查看lsqcurvefit的文档

代码语言:javascript
复制
x = lsqcurvefit(fun,x0,xdata,ydata);

它在文档中说,您有一个具有系数F(x,xdata)和样本点xdata的模型ydata,以及一组测量值ydata。该函数返回最小二乘参数集x,其中您的函数最接近测量值。

拟合算法通常需要起点,一些实现可以随机选择,在lsqcurvefit的情况下,这就是x0的目的。如果你有

代码语言:javascript
复制
h = @(x,y,z,t) ... %// actual function here
t_meas = ... %// actual measured times here
h_meas = ... %// actual measured data here

然后在lsqcurvefit的惯例中,

代码语言:javascript
复制
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

您的函数h(x,y,z,t)应该在t中向量化,因此对于t中的向量输入,返回值与t大小相同。然后,对lsqcurvefit的调用将给出最优的参数集:

代码语言:javascript
复制
x = lsqcurvefit(@(params,t) h(params(1),params(2),params(3),t),[x0,y0,z0],t_meas,h_meas);
h_fit = h(x(1),x(2),x(3),t_meas);  %// best guess from curve fitting

Python

在python中,您必须使用scipy.optimize模块,特别是类似于scipy.optimize.curve_fit的模块。根据上述约定,您需要类似于以下内容的内容:

代码语言:javascript
复制
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]的最优值。

代码语言:javascript
复制
x,y,z = popt
h_fit = h(x,y,z,t_meas)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35903023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档