我正在尝试使用 MATLAB 的符号工具箱来解决以下方程组。给定以下三个等式
w+x+y+z==k1;
(w^2)+(x^2)+(y^2)+(z^2)==k2;
w*x*y*z==k3;
其中k1
、k2
和k3
是常量,w
、x
、y
和z
是变量。目标是仅在以下情况下获得彼此p
和q
p==w+z;
q==(w*z)-(x*y);
也就是说,w
、x
、y
、z
应该在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)
但是输出是针对w
、x
等的,而不是一个方程(就变量p
和q
以及常数k1
、k2
和k3
而言(。如何实现这个单函数方程?
我将提取一个函数,它将得到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.q
是 k1
、 k2
、k3
和 p
的函数,所以你有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
的解决方案不是w
,x
,y
或z
,因此您不必担心解决方案的这些部分S
。你可以通过执行S=solve(eqn1,eqn2,eqn3,eqn4,eqn5,w,x,y,z,q)
来强制执行此操作,这将根据k1
、k2
、k3
和p
来写入所有这些变量。