有时,目标或约束函数除了独立变量之外还具有参数。额外的参数可以是数据,也可以表示在优化期间不会改变的变量。通过这些参数有三种方法:
全局变量很麻烦,因为它们不允许在函数之间重用名称。最好使用另外两种方法中的一种。
通常,对于基于问题的优化,您可以通过自然方式传递额外的参数。看通过基于问题的方法传递额外参数.
例如,假设您希望最小化函数
(1) |
对于不同的值A.那B.,和C..求解器接受只依赖于单个变量的目标函数(X.在这种情况下)。以下部分显示如何提供附加参数A.那B.,和C..解决方案金宝搏官方网站用于参数值A.= 4那B.= 2.1,和C.= 4靠近X.0.= [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)
假设你随后改变,A.
到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);= 9.8696 9.8696 -9.8696 . Fh (x, xdata
lsqcurvefit.
:%假设ydata存在x = lsqcurvefit(fh,x,xdata,ydata)
通过参数等式1通过嵌套函数,写一个文件
接受A.
那B.
那C.
,和X0.
作为输入
包含目标函数作为嵌套功能
呼叫Fminunc.
以下是此示例的函数文件的代码:
功能[x,fval] = lunnested(a,b,c,x0)[x,fval] = fminunc(@ nestedfun,x0);%嵌套函数,用于计算目标函数函数y =嵌套函数(x)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;结束
巢德福
,它可以访问变量A.
那B.
,和C.
.
运行优化,输入:
= 4;b = 2.1;C = 4;%分配参数值x0 = [0.5,0.5];[x,fval] = lunnested(a,b,c,x0)
全局变量可能是麻烦的,因此最好避免使用它们。此外,全局变量在并行计算中失败。看影响结果的因素.
要使用全局变量,请将变量声明为全局在工作区中,并在使用变量的函数中。
写一个函数文件:
F.unction 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 (x0 @globalfun)
输出与中的输出相同匿名功能.