传递额外的参数

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

有时,目标或约束功能除了拥有独立的可变参数。额外的参数可以是数据,或者可以代表优化过程中不改变的变量。有通过这些参数的三种方法:

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

一般来说,对于基于问题的优化,传递以自然的方式额外的参数。看到额外的参数传递中,基于问题的方法

例如,假设你希望尽量减少功能

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)

对于不同的值一种bC。求解者接受只依赖于单一变量的目标函数(X在这种情况下)。以下各节说明如何提供额外的参数一种bC。该解决方万博 尤文图斯案是参数值一种= 4b= 2.1C= 4X0= [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);fh(x, xdata) ans = 9.8696 9.8696 -9.8696
现在打电话lsqcurvefit
%假设YDATA存在X = lsqcurvefit(FH中,x,XDATA,YDATA)

嵌套函数

要传递的参数式(1)经由嵌套函数,写的单个文件

  • 接受一种bCX0作为输入

  • 包含目标函数的嵌套函数

  • 呼叫fminunc

下面是这个例子的功能文件中的代码:

函数[X,FVAL] = runnested(A,B,C,X0)[X,FVAL] = fminunc(@ nestedfun,X0);%嵌套函数,计算目标函数函数y = nestedfun(X)Y =(A  -  B *×(1)^ 2 + X(1)^ 4/3)* X(1)^ 2 + X(1)* X(2)+ ...(-c + C * X(2)^ 2)* X(2)^ 2;年底结束
目标函数是嵌套函数nestedfun它可以访问的变量一种bC

要运行优化,请输入:

= 4;b = 2.1;C = 4;%指派参数值X0 = [0.5,0.5]。[X,FVAL] = runnested(A,B,C,X0)
输出是相同匿名函数

全局变量

全局变量可能会很麻烦,所以最好避免使用它们。另外,全局变量无法在并行计算。看到影响业绩的因素

使用全局变量,声明变量是在工作空间,并在使用该变量的函数全局。

  1. 写一个函数文件:

    Function y = globalfun(x) global a b c y = (a - b*x(1)^2 + x(1)^4/3)*x(1)^2 + x(1)*x(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(@ globalfun,X0)

输出是相同匿名函数

相关的话题