1

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

以下是一次运行的结果:

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 上的系数(即,在之后出现的 Pc 上的系数vpa(ans1.xx)- 所以在上述情况下,它将是一个 1x6 向量[-0.429,-1.16,-1.07,-1.07,-0.232,-0.429,-1.16])。

我对 MATLAB 很陌生,但我确信我可以弄清楚如何实现循环代码来进行模型迭代。我想不通的是如何在每次迭代后记录系数向量。是否有一些“访问器”每次只给我每个方程的一个系数?类似的东西vpa(ans1.ps.coef(pc))(这完全是在黑暗中拍摄,这是错误的,但希望你明白)。

4

1 回答 1

1

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

步骤1:为了从 中获取Pcadouble的系数ans1.Ps,可以使用subs函数,如下:

 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
于 2013-01-03T07:23:50.650 回答