首页 > 解决方案 > 在 MATLAB 中进行优化的符号计算

问题描述

所以这是一个组合符号计算和优化问题。phi21我有一个由、phi31和的三个微分方程组成的系统phi32。等式中有四个参数我最终要针对k1k2f和进行优化s。我在下面的代码中设置了方程和雅可比行列式的构造:

syms phi21 phi31 phi32 k1 k2 f s a

w1 = (2*pi/24)*0.99;
w2 = (2*pi/24)*1.01;
w3 = (2*pi/24)*1.02;

f21 = (w2 - w1) + (1/3)*(-2*k1*sin(phi21) - 2*k2*sin(2*phi21) - k1*sin(phi31) - k2*sin(2*phi31) + k1*sin(phi32) + k2*sin(2*phi32)) + 2*f*cos((2*s - phi21)/2)*sin(-phi21/2);
f31 = (w3 - w1) + (1/3)*(k1*sin(phi21) + k2*sin(2*phi21) - k1*sin(phi31) - k2*sin(2*phi31) - 2*k1*sin(phi32) - 2*k2*sin(2*phi32)) + 2*f*cos((2*s - phi31)/2)*sin(-phi31/2);
f32 = (w3 - w2) + (1/3)*(-k1*sin(phi21) - k2*sin(2*phi21) - 2*k1*sin(phi31) - 2*k2*sin(2*phi31) - k1*sin(phi32) - k2*sin(2*phi32)) + + 2*f*cos((2*s - phi32)/2)*sin(-phi32/2);

df21d21 = diff(f21, phi21);
df21d31 = diff(f21, phi31);
df21d32 = diff(f21, phi32);

df31d21 = diff(f31, phi21);
df31d31 = diff(f31, phi31);
df31d32 = diff(f31, phi32);

df32d21 = diff(f32, phi21);
df32d31 = diff(f32, phi31);
df32d32 = diff(f32, phi32);


J = [df21d21 df21d31 df21d32; df31d21 df31d31 df31d32; df32d21 df32d31 df32d32];
lambda = eig(J);
rlambda = real(lambda);

srlambda = subs(rlambda, [phi21, phi31, phi32], [0.35475, 0.58305, 0.2271]);
seq = [subs(f21, [phi21, phi31, phi32], [0.35475, 0.58305, 0.2271]), subs(f31, [phi21, phi31, phi32], [0.35475, 0.58305, 0.2271]), subs(f32, [phi21, phi31, phi32], [0.35475, 0.58305, 0.2271])];

完成此操作后,我希望进行优化,使 f21 = f31 = f32 = 0 并且特征值都是负数。但是,我不知道如何在一些非线性优化过程中使用我的符号表达式。我有一些看起来像这样的代码:

x0 = [];
lb = [];
ub = [];

[sol, fval, exitflag, output] = fmincon(@eq1, x0, A, b, Aeq, beq, lb, ub, @constraints)

function objfun = eq1(k)
objfun = ;
end

function [c, ceq] = constraints(k)
c = [];
ceq = [];
end

我可以在其中指定初始搜索点、上限和下限以及ceq我的f21f31f32条件的向量c和我的特征值条件的向量。我已经知道有几个问题。k(1)首先,优化部分需要以、 、 和形式的变量k(2)k(3)k(4)不是k1k2fs。有没有办法轻松做到这一点?其次,我需要将符号约束转换为 MATLAB 函数吗?可能还有其他问题,但我不确定。任何帮助将不胜感激 :)

标签: matlaboptimizationsymbolic-math

解决方案


您可以使用. f21_ f31_ 这将使它们可执行(并输出双精度值而不是符号值),并让它们采用按字母顺序排序的多个输入参数。f32seqmatlabFunction

因此,matlabFunction(seq)将导致一个匿名函数(f,k1,k2,s)作为输入参数。您还可以使用 的'File'参数将函数存储在文件中matlabFunction

要让此函数采用您想要优化的参数向量,您可以编写一个小的“包装器”:

f_seq = matlabFunction(seq); % anonymous function that takes (f,k1,k2,s) as inputs
f_seq2 = @(p) f_seq(p(1),p(2),p(3),p(4)); % anonymous function that takes a 4 element vector

我建议将所有函数保存在文件中(也是包装器),因为对象函数有自己的工作区(即无法访问基本工作区中的匿名函数句柄)。


推荐阅读