MATLAB如何在符号方程系统解决方案中访问特定系数?

时间:2013-01-03 06:13:43

标签: matlab montecarlo symbolic-math

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

以下内容从单次运行中获取结果:

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 个答案:

答案 0 :(得分:1)

可能有更好的方法可以做到这一点,但这就是我现在所能做到的。

第1步: 要从Pc获取double系数为ans1.Ps,您可以使用subs function,如下所示:

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

步骤2a:

要获得每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

步骤2b:

或者,您希望只获得Pc,但是来自所有ans1表达式。如果是,那么您可以执行以下操作:

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