我需要在一个方程组上运行一个简单的蒙特卡罗变系数。我需要记录每次一个变量的解系数。
下面是单次运行的结果:
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