编写带有矩阵数据实体的多元目标函数

时间:2018-11-10 17:17:59

标签: octave

S1=[20 32 44 56 68 80 92 104 116 128 140 152 164 176 188 200];
P=[16.82 26.93 37.01 47.1 57.21 67.32 77.41 87.5 97.54 107.7 117.8 127.9 138 148 158.2 168.3];
X = [0.119 0.191 0.262 0.334 0.405 0.477 0.548 0.620 0.691 0.763 0.835 0.906 0.978 1.049 1.120 1.192];
S = [2.3734 3.6058 5.0256 6.6854 8.6413 10.978 13.897 17.396 21.971 28.040 36.475 49.065 69.736 110.20 224.69 2779.1];

objective=@(x)((1250*x(3)*S(a)-(S(a)+x(2))*(P(a)+x(1)))/(1250*(S(a)+x(2))*(P(a)+x(1)))-x(5))^2+((x(2)*(P(a)^2+x(1)*P(a)))/(1250*x(4)*X(a)*x(3)-P(a)^2-x(1)*P(a))-S(a))^2+(74000/3*((X(a)*x(3)*S(a))/S1(a)*(S(a)+x(2)))-P(a))^2

%x0 = [Kp Ks mu.m Yp mu.d]
x0=[7.347705469 14.88611028 1.19747242 16.65696429 6.01E-03];

x=fminunc(objective,x0);
disp(x)

上面的代码用于优化目标函数,以便可以找到所有未知的参数值。如您所见,目标函数由4个变量(S1,S,P,X)组成,每个变量都有16个数据实体。我的问题是:如何创建目标函数,以便利用所有数据实体? 最终目标函数必须是目标函数之和(如上所示),且a = 1:16。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

对代码进行以下更改:

  1. 替换,例如所有S(a)S的变量都可以使用整个向量。对四个变量中的每一个都执行相同的操作。

  2. 将目标函数中的所有“标量”运算转换为“元素明智”的运算,即将^*/替换为.^,{{ 1}}和.*。这样会产生16个值,每个索引从1到16(即先前由./所指的值)对应一个值。

  3. 将结果表达式包装到a函数中,以将16个结果求和为最终值

  4. 正常使用优化器。

结果代码:

sum()

请注意,您可以使此代码更清晰易读,便于人类阅读。我刚刚进行了“直接”更改,以说明从标量表达式到所需矢量化表达式的转换。