主要内容

传递额外的参数

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

有时目标或约束函数参数除了自变量。额外的参数数据,或者能代表变量在优化不改变。通过这些参数的方法有三种:

麻烦,因为他们不允许全局变量名称中被重用的功能。最好是使用另外两个方法之一。

一般来说,对于具体问题具体分析优化,您以自然的方式传递额外的参数。看到通过额外的参数具体问题具体分析的方法

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

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。参数值的金宝搏官方网站解决方案一个= 4,b= 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) ^ 2) * x (2) ^ 2;

  2. 赋值参数和定义一个函数处理f一个匿名函数,在MATLAB输入以下命令®提示:

    = 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

请注意

在匿名函数传递的参数是那些存在创建匿名函数。考虑一下这个例子

= 4;b = 2.1;c = 4;f = @ (x) parameterfun (x, a, b, c)

假设你随后的变化,一个3和运行

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

你会得到同样的答案,parameterfun使用一个= 4,当f被创建。

改变的参数传递给函数,通过输入更新匿名函数:

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

您可以创建多个参数的匿名函数。例如,使用lsqcurvefit,首先创建一个函数,它有两个输入参数,xxdata:

跳频= @ (x, xdata) (sin (x)。* xdata + (x ^ 2)。* cos (xdata));x =π;xdata =π* (4;2、3);跳频(x, xdata)
ans = 9.8696 9.8696 -9.8696
现在所称的lsqcurvefit:
%认为ydata存在x = lsqcurvefit (fh, x, xdata ydata)

嵌套函数

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

  • 接受一个,b,c,x0作为输入

  • 包含目标函数嵌套函数

  • 调用fminunc

这是函数的代码文件对于这个例子:

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

优化运行,输入:

= 4;b = 2.1;c = 4;%分配参数值x0 = [0.5, 0.5];[x, fval] = runnested (a, b, c, x0)
输出是一样的匿名函数

全局变量

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

使用全局变量,在工作区中声明的变量是全局变量和函数使用。

  1. 写一个函数文件:

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

  2. 在MATLAB工作区,定义变量和运行fminunc:

    全球a b c;= 4;b = 2.1;c = 4;%分配参数值x0 = [0.5, 0.5];[x, fval] = fminunc (x0 @globalfun)

输出是一样的匿名函数

相关的话题