2013-01-03 31 views
1

我需要在一個方程組上運行簡單的蒙特卡羅變係數。我需要每次記錄其中一個變量的解算係數。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

可能有更好的方法來做到這一點,但這是我現在所能想到的。

步驟1: 爲了獲得的Pc係數從ans1.Ps一個double,則可以使用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 

,如果你想了解的係數所有信息現在,您可以將二者結合起來。

編輯:

要存儲檢索電腦每次迭代,你可以做到以下幾點:

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 
+0

這是偉大的,我覺得我幾乎沒有。我如何將檢索到的Pc每次迭代存儲到矩陣中? (這可能很容易,但我又是新來的matlab)。感謝您的回答! – Trevor

+0

我已經添加了另一個代碼段來進一步解釋它... – bla

+0

謝謝!感謝幫助。 – Trevor

相關問題