在 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;
其中 k1
、k2
和 k3
是常量,w
、x
、y
和 z
是变量。 objective是在
的情况下,得到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
)。如何实现这个单函数方程?
运行 你的代码
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.q
是k1
、k2
、k3
和[=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
的解不是根据 w
、x
、y
或 z
,所以你不必担心解决方案的那些部分 S
。您可以通过执行 S=solve(eqn1,eqn2,eqn3,eqn4,eqn5,w,x,y,z,q)
强制发生这种情况,这将根据 k1
、k2
、k3
和 p
.[=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
我正在尝试使用 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
是变量。 objective是在
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
)。如何实现这个单函数方程?
运行 你的代码
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.q
是k1
、k2
、k3
和[=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
的解不是根据 w
、x
、y
或 z
,所以你不必担心解决方案的那些部分 S
。您可以通过执行 S=solve(eqn1,eqn2,eqn3,eqn4,eqn5,w,x,y,z,q)
强制发生这种情况,这将根据 k1
、k2
、k3
和 p
.[=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