主要内容

传递额外参数

额外参数,固定变量或数据

有时目标函数或约束函数除了自变量外还有参数。额外的参数可以是数据,也可以表示在优化过程中不会改变的变量。传递这些参数有三种方法:

全局变量很麻烦,因为它们不允许在函数之间重用名称。最好使用其他两种方法中的一种。

通常,对于基于问题的优化,您以自然的方式传递额外的参数。看到在基于问题的方法中传递额外的参数

例如,假设你想要最小化这个函数

f x 一个 b x 1 2 + x 1 4 / 3. x 1 2 + x 1 x 2 + c + c x 2 2 x 2 2 (1)

对于不同的值一个b,c.求解器接受仅依赖于单个变量(x在这种情况下)。下面几节将展示如何提供附加参数一个b,c.解是针对参数值的一个= 4b= 2.1,c= 4附近x0= [0.5 0.5]使用fminunc

匿名函数

使用匿名函数传递参数:

  1. 写一个包含以下代码的文件:

    函数y = parameterfun (x, a, b, c) y = x (a - b * (1) ^ 2 + x (1) ^ 4/3) * x (1) ^ 2 + x(1) *(2) +…(-c + c*x(2)²)*x(2)²;

  2. 为参数赋值并定义函数句柄f通过在MATLAB中输入以下命令来获得一个匿名函数®提示:

    A = 4;B = 2.1;C = 4;%指定参数值x0 = [0.5,0.5];F = @(x)parameterfun(x,a,b,c);

  3. 调用求解器fminunc使用匿名函数:

    [x,fval] = fminunc(f,x0)
    命令窗口显示如下信息:
    找到局部极小值。优化完成,因为梯度的大小小于函数的默认值公差。X = -0.0898 0.7127 fval = -1.0316

请注意

匿名函数中传递的参数是创建匿名函数时存在的参数。考虑下面的例子

A = 4;B = 2.1;C = 4;F = @(x)parameterfun(x,a,b,c)

假设你随后改变了,一个到3然后运行

[x,fval] = fminunc(f,x0)

你会得到和之前一样的答案,因为parameterfun使用A = 4,时的值f被创建。

要更改传递给函数的参数,请重新输入匿名函数:

A = 3;F = @(x)parameterfun(x,a,b,c)

可以创建具有多个参数的匿名函数。例如,使用lsqcurvefit,首先创建一个带有两个输入参数的函数,x而且xdata

Fh = @(x,xdata)(sin(x)。* xdata + (x ^ 2)。* cos (xdata));X =;Xdata = pi*[4;2;3];Fh (x, xdata) ans = 9.8696 9.8696 -9.8696
现在所称的lsqcurvefit
%假设ydata存在x = lsqcurvefit(fh,x,xdata,ydata)

嵌套函数

传递参数方程1通过一个嵌套函数,写一个单一的文件

  • 接受一个bc,x0作为输入

  • 将目标函数作为嵌套函数包含

  • 调用fminunc

下面是这个例子的函数文件的代码:

函数[x,fval] = runnested(a,b,c,x0) [x,fval] = fminunc(@nestedfun,x0);%计算目标函数的嵌套函数y = nestedfun(x) y = (a - b*x(1)²+ x(1)^4/3)*x(1)²+ x(1)*x(2) +…(-c + c*x(2)²)*x(2)²;结束结束
目标函数是嵌套函数nestedfun,它可以访问变量一个b,c

要运行优化,输入:

A = 4;B = 2.1;指定参数值x0 = [0.5,0.5];[x,fval] = runnested(a,b,c,x0)
输出与in相同匿名函数

全局变量

全局变量可能很麻烦,所以最好避免使用它们。此外,全局变量在并行计算中失败。看到影响结果的因素

若要使用全局变量,请在工作空间和使用这些变量的函数中将变量声明为全局变量。

  1. 写一个函数文件:

    函数y = globalfun全球a b c (x) y = x (a - b * (1) ^ 2 + x (1) ^ 4/3) * x (1) ^ 2 + x(1) *(2) +…(-c + c*x(2)²)*x(2)²;

  2. 在MATLAB工作区中,定义变量并运行fminunc

    全局a b c;A = 4;B = 2.1;C = 4;%指定参数值x0 = [0.5,0.5];[x,fval] = fminunc(@globalfun,x0)

输出与in相同匿名函数

相关的话题

Baidu
map