我需要在方程组上运行简单的蒙特卡罗变系数。我需要每次记录其中一个变量的求解系数。
以下内容从单次运行中获取结果:
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))
这样的东西(在黑暗中是一个完整的镜头,这是错误的,但希望你能得到这个想法)。
答案 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