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

Algebraic simultaneous equations using symbolic toolbox in MATLAB

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

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

其中 k1k2k3 是常量,wxyz 是变量。 objective是在

的情况下,得到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)。如何实现这个单函数方程?

运行 你的代码

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)

returns(至少在 R2015a 上)

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

其中每个都有8个字段(对应8个解),S.qk1k2k3和[=16的函数=] 而已,所以你有 q=f(k1,k2,k3,p)。通过使用 symvar(S.q),returns [ k1, k2, k3, p],您可以很容易地看到 q 仅依赖于这些变量。这就是你想要的,你总是可以做 f=S.q-q 来得到像 f(k1,k2,k3,p,q)=0.

这样的东西

基本上,q 的解不是根据 wxyz,所以你不必担心解决方案的那些部分 S。您可以通过执行 S=solve(eqn1,eqn2,eqn3,eqn4,eqn5,w,x,y,z,q) 强制发生这种情况,这将根据 k1k2k3p.[=34 写入所有这些变量=]

我要提取一个函数,它将得到 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