MATLAB中使用符号工具箱的代数联立方程

时间:2015-11-10 23:13:44

标签: matlab symbolic-math

我正在尝试使用MATLAB的符号工具箱来解决以下方程组。给出以下三个方程式

w+x+y+z==k1;
(w^2)+(x^2)+(y^2)+(z^2)==k2;
w*x*y*z==k3;

其中k1k2k3是常量而wxyz是变量。目标是仅在

的情况下相互获取pq
p==w+z;
q==(w*z)-(x*y); 

也就是说,wxyz应该在pq等式中被消除以获得单个函数,f(p,q,k1,k2,k3)。

我以下列方式使用代码:

syms w x y z p q
eqn1 = w+x+y+z==k1;
eqn2 = w*x*y*z==k2;
eqn3 = (w^2)+(x^2)+(y^2)+(z^2)==k3;
eqn4 = w+z-p==0;
eqn5 = (w*z)-(x*y)-q==0;
solve(eqn1,eqn2,eqn3,eqn4,eqn5)

但输出是wx等,而不是一个等式(根据变量pq以及常量k1k2k3)。如何实现这个单函数方程?

2 个答案:

答案 0 :(得分:0)

运行代码

syms w x y z p q k1 k2 k3
eqn1 = w+x+y+z==k1;
eqn2 = w*x*y*z==k2;
eqn3 = (w^2)+(x^2)+(y^2)+(z^2)==k3;
eqn4 = w+z-p==0;
eqn5 = (w*z)-(x*y)-q==0;
S=solve(eqn1,eqn2,eqn3,eqn4,eqn5)

返回(至少在R2015a上)

S = 
    q: [8x1 sym]
    w: [8x1 sym]
    x: [8x1 sym]
    y: [8x1 sym]
    z: [8x1 sym]

,其中每个都有8个字段(对应8个解决方案),S.qk1k2k3p的函数只有,所以你有q=f(k1,k2,k3,p)。您可以使用q轻松查看symvar(S.q)仅依赖于这些变量,[ k1, k2, k3, p]会返回f=S.q-q。这就是你想要的,你总是可以f(k1,k2,k3,p,q)=0得到类似q的东西。

基本上,事实证明w的解决方案不是xyzS,所以你不要我不得不担心解决方案S=solve(eqn1,eqn2,eqn3,eqn4,eqn5,w,x,y,z,q)的那些部分。您可以通过执行k1来强制执行此操作,k2会根据k3pdocker build --build-arg APP_SRC=$BUILD_CONTEXT -y tag . $APP_SRC来编写所有变量。

答案 1 :(得分:0)

我将提取一个函数,它将得到p并给出q。

假设我们有(k1,k2,k3,p)然后我们想要q。

所以方程是:

[K1,K2,K3,P] = F(W,X,Y,Z);

我们要反转f函数。意思是我们有[k1,k2,k3,p],我们想要[x,y,z,w](4个等式和4个未知变量)。然后我们可以使用[x,y,z,w]计算q。

使用以下代码。请记住,没有一个答案。方程有2个答案。

    clc
    clear all

    syms w x y z p q k1 k2 k3
    eqn1 = w+x+y+z-k1;
    eqn2 = w*x*y*z-k2;
    eqn3 = (w^2)+(x^2)+(y^2)+(z^2)-k3;
    eqn4 = w+z-p;

    s=solve(eqn1,eqn2,eqn3,eqn4);
    x=s.x;
    y=s.y;
    z=s.z;
    w=s.w;

    q=(w.*z)-(x.*y); 

    %Removing repeated answers
    i=1;
    while i<=length(q)
        v=(simplify(q(i)-q)==0)&(1:length(q)~=i).';
        if any(v)
            q(v)=[];
            i=1;
        else
            i=i+1;
        end
    end
    %Displaying unique answers
    for i=1:length(q)
        fprintf('Answer %d\nq=%s\n\n',i,char(q(i)));
    end