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



我正在尝试使用 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应该在p中被消除,q方程得到一个函数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而言(。如何实现这个单函数方程?

我将提取一个函数,它将得到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 %dnq=%snn',i,char(q(i)));
    end

运行你的代码

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)。通过使用返回 [ k1, k2, k3, p]symvar(S.q),您可以轻松看到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来写入所有这些变量。

最新更新