如何在MATLAB中获取一个特定系数方程的符号系统解



我需要在一个方程组上运行一个简单的蒙特卡罗变系数。我需要记录每次一个变量的解系数。

下面是单次运行的结果:

syms alpha gamma Ps Pc beta lambda Pp Sp Ss Dp Ds;
eq1 = -Ss + alpha + 0.17*Ps - 1*Pc;
eq2 = -Sp + beta + 0.2*Pp;
eq3 = -Ds + gamma - 0.2*Ps + 1*Pp;
eq4 = -Dp + lambda - 0.17*Pp + 1*Ps;
eq5 = Ss - Ds;
eq6 = Sp - Dp;
ans1 = solve(eq1,eq2,eq3,eq4,eq5,eq6,'Ps','Pp','Ss','Ds','Sp','Dp');
disp('Ps')
vpa(ans1.Ps,3)
disp('Pp')
vpa(ans1.Pp,3)
disp('Ss')
vpa(ans1.Ss,3)
disp('Ds')
vpa(ans1.Ds,3)
disp('Sp')
vpa(ans1.Sp,3)
disp('Dp')
vpa(ans1.Dp,3)

我将改变几个变量(在Ps, Pp和Pc上),并在每个简化形式方程中记录Pc上的系数(即在vpa(ans1.xx)之后出现的Pc上的系数-因此在上面的情况下,它将是一个1x6向量[-0.429,-1.16,-1.07,-1.07,-0.232,-0.429,-1.16])。

我对MATLAB很陌生,但我相信我能弄清楚如何实现循环代码来做模型迭代。我不知道的是如何记录每次迭代后的系数向量。是否存在某种"访问器",每次只给我每个方程一个系数?像vpa(ans1.ps.coef(pc))(这是一个完全在黑暗中拍摄,这是错误的,但希望你得到的想法)。

可能有更好的方法,但这是我目前所能想到的。

步骤1:为了从ans1.Ps得到Pc作为double的系数,可以使用subs函数,如下所示:

 subs(ans1.Ps,{alpha,Pc,beta,gamma,lambda},{0,1,0,0,0});

步骤2:

要获得每个ans1表达式(例如ans1.Ps)的所有系数的向量,您可以使用这样的内容:

N=numel(symvar(ans1.Ps)); % obtain number of coefs
cp=num2cell(eye(N));      % create a cell array using unit matrix, so each iteration a different coef will be selected
for n=1:N;
   coefs(n)=subs(ans1.Ps,{alpha,Pc,beta,gamma,lambda},cp(n,:));
end

步骤2 b:

或者,您只希望从所有的ans1表达式中获得Pc。如果是这样,那么您可以执行以下操作:

SNames = fieldnames(ans1); % get names of ans1 expressions
for n = 1:numel(SNames) 
    expr = ans1.(SNames{n}); % get the expression itself
    pc(n)=subs(expr,{alpha,Pc,beta,gamma,lambda},{0,1,0,0,0}); % obtain just pc
end

如果您想要有关系数的所有信息,现在可以将两者组合起来。

编辑:

要在每次迭代中存储检索到的Pc,您可以执行以下操作:

alpha=[3 1 4 6 7] % just a vector of values
beta = [6 7 8 5 2]
SNames = fieldnames(ans1); % get names of ans1 expressions
for n = 1:numel(SNames) 
    expr = ans1.(SNames{n}); % get the expression itself
    for n1=1:numel(alpha)
        for n2=1:numel(beta) 
            pc(n,n1,n2)=subs(expr,{alpha,Pc,beta,gamma,lambda},{alpha(n1),1,beta(n2),0,0})
         end
    end
end

最新更新