matlab 非线性拟合函数,MATLAB非线性拟合-fminsearch函数的使用

fminsearch函数用来求解多维无约束的线性优化问题

用derivative-free的方法找到多变量无约束函数的最小值

语法

x =

fminsearch(fun,x0)

x =

fminsearch(fun,x0,options)

[x,fval] =

fminsearch(...)

[x,fval,exitflag] = fminsearch(...)

[x,fval,exitflag,output] = fminsearch(...)

解释

fminsearch能够从一个初始值开始,找到一个标量函数的最小值。通常被称为无约束非线性优化

x = fminsearch(fun,x0)

从x0开始,找到函数fun中的局部最小值x,x0可以是标量,向量,矩阵。fun是一个函数句柄

x = fminsearch(fun,x0,options)

以优化参数指定的结构最小化函数,可以用optimset函数定义这些参数。(见matlab help)

[x,fval] = fminsearch(...)返回在结果x出的目标函数的函数值

[x,fval,exitflag] = fminsearch(...)

返回exitflag值来表示fminsearch退出的条件:

1--函数找到结果x

0--函数最大功能评价次数达到,或者是迭代次数达到

-1--算法由外部函数结束

[x,fval,exitflag,output] = fminsearch(...)

返回一个结构输出output,包含最优化函数的信息:output.algorithm 使用的优化算法

output.funcCount 函式计算次数

output.iterations 迭代次数

output.message 退出信息

另外

fun是需要最小化的函数,他的输入为input,输出为标量f,目标函数在x上作出估计,函数可以为M文件的一个句柄函数(当是M文件时,用单引号括起文件名):

functionx = fminsearch(@myfun, x0)

这里function f = myfun(x)

f = ... 其自变量为x

或者直接写出

asx = fminsearch(@(x)sin(x^2), x0);

例子

例1:一个典型的测试就是求多维the Rosenbrock banana

function函数的最小值,其最小值在(1,1),其值为0. 一般开始迭代在(-1.2,1). 这里定义一个句柄函数banana =

@(x)100*(x(2)-x(1)^2)^2+(1-x(1))^2;将这个函数传递给fminsearch为x,fval] =

fminsearch(banana,[-1.2, 1])。结果

x =

1.0000 1.0000

fval =

8.1777e-010

说明函数在x处有近似于0的最小值,且估计结果有四位小数

例2:

如果fun是有参数的,那么可以定义个匿名函数去获得独立的参数,例如,若果需要估计的函数为

function f = myfun(x,a)

f = x(1)^2 + a*x(2)^2

因为myfun中有一个位置参数a,所以不能直接传给fminsearch中。所以需要最优化具体的a,例如a = 1.5

首先定义 a = 1.5;

然后x = fminsearch(@(x) myfun(x,a),[0,1])

for a specific value of a, such as a = 1.5.Assign the value to a. a

= 1.5; % define parameter firstCall fminsearch with a

one-argument anonymous function that captures that value of a

and

calls myfun with two arguments:x = fminsearch(@(x)

myfun(x,a),[0,1])

例3 我们可以将例1中的banana函数改变一下,这样最小值点改变到了[a,a^2].

对于一个特定的a,如a=sqrt(2),我们可以如下做

a = sqrt(2);

banana = @(x)100*(x(2)-x(1)^2)^2+(a-x(1))^2;

然后[x,fval] = fminsearch(banana, [-1.2, 1],

optimset('TolX',1e-8));

则可以找到一个比默认值准确度高的x,使[sqrt(2), 2] 为最小值

算法

fminsearch使用单纯型法,这是一种不会使用数值或者梯度分析的直接的方法

假如x的长度为n,那么会有n+1个顶点,两维空间中,单纯型是三角形,三维空间,他是一个锥形。搜索的每一步中,都会产生离当前单纯型比较近的点,在新的点上的函数值回合单纯型各个顶点上的值比较,一般都会有一个定点被替代,产生一个新的单纯型,重复步骤,直到单纯型的大小小于阈值。

限制

fminsearch可以处理不连续的问题,如果得不到全局最优,则其会得到局部最优

它只能最小化时数,复数并不在其能力范围之内,且f(x)的返回值也必须是时数,如果x为复数,则其必须分解为实部和虚部两部分。

我们可以稍微对进行一些变换,就可实现利用fminsearch进行参数估计。

例如,原始信号发生器模型为:Z=3*exp(-0.4*x)+12*exp(-3.2*x);

假设有两个参数我们未知,即我们要进行参数估计的模型为

z=a(1)*exp(a(2)*x)+a(3)*exp(a(4)*x);

下面我们只需采用以下代码就可以实现上述参数的估计。

x=[0:0.2:4]';

Z=3*exp(-0.4*x)+12*exp(-3.2*x);

c=[1 1 1 1];

options=optimset('fminsearch');

options.TolX=0.001;

options.Display='off';

[a,sfval,sexit,soutput]=fminsearch(@fun,c,options,x,Z)

函数定义为:

function E=fun(a,x,Z)

z=a(1)*exp(a(2)*x)+a(3)*exp(a(4)*x);

E=sum((Z-z).^2);

结果为:

a =

3.0004 -0.4001 11.9994 -3.2000

sfval =

1.5099e-007

sexit =

1

soutput =

iterations: 190

funcCount: 322

algorithm: 'Nelder-Mead simplex direct search'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值