有时,目标或约束功能除了拥有独立的可变参数。额外的参数可以是数据,或者可以代表优化过程中不改变的变量。有通过这些参数的三种方法:
麻烦,因为他们不允许全局变量名称中被重用的功能。最好使用其他两种方法中的一种。
一般来说,对于基于问题的优化,传递以自然的方式额外的参数。看到额外的参数传递中,基于问题的方法。
例如,假设你希望尽量减少功能
(1) |
对于不同的值一种,b和C。求解者接受只依赖于单一变量的目标函数(X在这种情况下)。以下各节说明如何提供额外的参数一种,b和C。该解决方万博 尤文图斯案是参数值一种= 4,b= 2.1和C= 4近X0= [0.5 0.5]运用fminunc
。
要通过使用匿名函数参数:
编写包含以下代码的文件:
函数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;
给参数赋值并定义函数句柄F
通过在MATLAB中输入以下命令生成一个匿名函数®提示:
= 4;b = 2.1;c = 4;%赋值参数值x0 = [0.5,0.5];f = @ (x) parameterfun (x, a, b, c);
让解决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
,首先创建一个接受两个输入参数的函数,X
和XDATA
:
跳频= @ (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)经由嵌套函数,写的单个文件
接受一种
,b
,C
和X0
作为输入
包含目标函数的嵌套函数
呼叫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
它可以访问的变量一种
,b
和C
。
要运行优化,请输入:
= 4;b = 2.1;C = 4;%指派参数值X0 = [0.5,0.5]。[X,FVAL] = runnested(A,B,C,X0)
全局变量可能会很麻烦,所以最好避免使用它们。另外,全局变量无法在并行计算。看到影响业绩的因素。
使用全局变量,声明变量是在工作空间,并在使用该变量的函数全局。
写一个函数文件:
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;
在您的工作空间MATLAB,定义变量和运行fminunc
:
全球A B C;= 4;b = 2.1;c = 4;%赋值参数值x0 = [0.5,0.5];[X,FVAL] = fminunc(@ globalfun,X0)
输出是相同匿名函数。