传递额外的参数
额外的参数,固定的变量或数据
有时目标或约束函数参数除了自变量。额外的参数数据,或者能代表变量在优化不改变。通过这些参数的方法有三种:
麻烦,因为他们不允许全局变量名称中被重用的功能。最好是使用另外两个方法之一。
一般来说,对于具体问题具体分析优化,您以自然的方式传递额外的参数。看到通过额外的参数具体问题具体分析的方法。
例如,假设你想最小化函数
(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);跳频(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)
全局变量
全局变量可以麻烦,所以最好是避免使用它们。同样,全局变量在并行计算失败。看到影响结果的因素。
使用全局变量,在工作区中声明的变量是全局变量和函数使用。
写一个函数文件:
函数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;
在MATLAB工作区,定义变量和运行
fminunc
:全球a b c;= 4;b = 2.1;c = 4;%分配参数值x0 = [0.5, 0.5];[x, fval] = fminunc (x0 @globalfun)
输出是一样的匿名函数。