【问题标题】:MATLAB how do I access a specific coefficient in a symbolic equation system solution?MATLAB如何访问符号方程系统解中的特定系数?
【发布时间】:2013-01-04 01:23:17
【问题描述】:

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

以下是我一次运行的结果:

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 上的系数@--so在上述情况下,它将是一个 1x6 向量 [-0.429,-1.16,-1.07,-1.07,-0.232,-0.429,-1.16])。

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

【问题讨论】:

    标签: matlab montecarlo symbolic-math


    【解决方案1】:

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

    第 1 步: 为了从ans1.Ps得到Pc的系数为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:

    或者,您只想从所有 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
    

    【讨论】:

    • 这太棒了,我觉得我快到了。我如何将每次迭代检索到的 Pc 存储到矩阵中? (这可能真的很容易,但我还是 matlab 的新手)。感谢您的回答!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多