在使用MATLAB的solve函数求解非线性方程时,有可能会在求解的结果中出现z(或者z1)和root,无法得出数值结果。今天主要是以实际的例子,用三种方法解决这个问题。
1.实例1
程序
clc;
clear all;
syms x y z u v w;
eqn=[-5*x+20*y+y*z==0,-x-5*y+2*x*z-v==0,-z+2*u-2*x*y==0,-z-5*u+w==0,-y+v-w==0,v-u==0];
var=[x,y,z,u,v,w];
[x,y,z,u,v,w]=solve(eqn,var)
运行结果
x =
0
(1253323104*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 1)^2)/10108417235 - (143782272*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 1)^3)/10108417235 - (64966543683*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 1))/20216834470 - 6753430183/8086733788
(1253323104*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 2)^2)/10108417235 - (143782272*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 2)^3)/10108417235 - (64966543683*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 2))/20216834470 - 6753430183/8086733788
(1253323104*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 3)^2)/10108417235 - (143782272*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 3)^3)/10108417235 - (64966543683*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 3))/20216834470 - 6753430183/8086733788
(1253323104*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 4)^2)/10108417235 - (143782272*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 4)^3)/10108417235 - (64966543683*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 4))/20216834470 - 6753430183/8086733788
y =
0
- (132488256*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 1)^2)/10108417235 - (6267264*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 1)^3)/10108417235 - (15779928907*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 1))/20216834470 - 1718896477/8086733788
- (132488256*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 2)^2)/10108417235 - (6267264*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 2)^3)/10108417235 - (15779928907*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 2))/20216834470 - 1718896477/8086733788
- (132488256*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 3)^2)/10108417235 - (6267264*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 3)^3)/10108417235 - (15779928907*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 3))/20216834470 - 1718896477/8086733788
- (132488256*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 4)^2)/10108417235 - (6267264*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 4)^3)/10108417235 - (15779928907*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 4))/20216834470 - 1718896477/8086733788
z =
0
(132488256*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 1)^2)/2021683447 + (6267264*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 1)^3)/2021683447 - (393538669*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 1))/4043366894 + 8594482385/8086733788
(132488256*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 2)^2)/2021683447 + (6267264*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 2)^3)/2021683447 - (393538669*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 2))/4043366894 + 8594482385/8086733788
(132488256*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 3)^2)/2021683447 + (6267264*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 3)^3)/2021683447 - (393538669*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 3))/4043366894 + 8594482385/8086733788
(132488256*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 4)^2)/2021683447 + (6267264*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 4)^3)/2021683447 - (393538669*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 4))/4043366894 + 8594482385/8086733788
u =
0
(4436905563*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 1))/20216834470 - (6267264*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 1)^3)/10108417235 - (132488256*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 1)^2)/10108417235 - 1718896477/8086733788
(4436905563*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 2))/20216834470 - (6267264*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 2)^3)/10108417235 - (132488256*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 2)^2)/10108417235 - 1718896477/8086733788
(4436905563*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 3))/20216834470 - (6267264*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 3)^3)/10108417235 - (132488256*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 3)^2)/10108417235 - 1718896477/8086733788
(4436905563*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 4))/20216834470 - (6267264*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 4)^3)/10108417235 - (132488256*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 4)^2)/10108417235 - 1718896477/8086733788
v =
0
(4436905563*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 1))/20216834470 - (6267264*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 1)^3)/10108417235 - (132488256*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 1)^2)/10108417235 - 1718896477/8086733788
(4436905563*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 2))/20216834470 - (6267264*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 2)^3)/10108417235 - (132488256*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 2)^2)/10108417235 - 1718896477/8086733788
(4436905563*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 3))/20216834470 - (6267264*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 3)^3)/10108417235 - (132488256*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 3)^2)/10108417235 - 1718896477/8086733788
(4436905563*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 4))/20216834470 - (6267264*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 4)^3)/10108417235 - (132488256*root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 4)^2)/10108417235 - 1718896477/8086733788
w =
0
root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 1)
root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 2)
root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 3)
root(z1^4 - (159*z1^3)/19 + (3349633*z1^2)/14592 + (1397285*z1)/14592 + 4898525/58368, z1, 4)
在官方的帮助文档中有找到出现z和root的原因
Numerically Approximating Symbolic Solutions That Contain root
When solving polynomials, solve might return solutions containing root.
To numerically approximate these solutions, use vpa. Consider the following
equation and solution.
在求解多项式或者高阶非线性方程时,求解可能返回含有根的解。要用数字近似这些解,请使用vpa()。
方法1:我们可以使用double函数对结果进行数字近似化。
double 是 MATLAB 中的默认数值数据类型(类),它可为大多数计算任务
提供足够的精度。数值变量自动存储为 64 位(8 字节)双精度浮点值。
Y = double(X)
程序
clc;
clear all;
syms x y z u v w;
eqn=[-5*x+20*y+y*z==0,-x-5*y+2*x*z-v==0,-z+2*u-2*x*y==0,-z-5*u+w==0,-y+v-w==0,v-u==0];
var=[x,y,z,u,v,w];
[x,y,z,u,v,w]=solve(eqn,var);
x = double(x)
y = double(y)
z = double(z)
u = double(u)
v = double(v)
w = double(w)
运行结果
x =
0.0000 + 0.0000i
-0.1889 + 1.8323i
-0.1889 - 1.8323i
-0.1861 - 1.3171i
-0.1861 + 1.3171i
y =
0.0000 + 0.0000i
-0.0434 + 0.4350i
-0.0434 - 0.4350i
0.5960 +11.6818i
0.5960 -11.6818i
z =
0.0000 + 0.0000i
1.0663 + 0.0706i
1.0663 - 0.0706i
-20.5663 + 0.0507i
-20.5663 - 0.0507i
u =
0.0000 + 0.0000i
-0.2557 - 0.1264i
-0.2557 + 0.1264i
4.9926 - 2.9331i
4.9926 + 2.9331i
v =
0.0000 + 0.0000i
-0.2557 - 0.1264i
-0.2557 + 0.1264i
4.9926 - 2.9331i
4.9926 + 2.9331i
w =
0.0000 + 0.0000i
-0.2124 - 0.5614i
-0.2124 + 0.5614i
4.3966 -14.6150i
4.3966 +14.6150i
2.实例2
程序
clc;
clear all;
syms x y
[x,y]=solve((x-2)^2+(y+2*x-3)^2==5,2*(x-3)^2+(y/ 3)^2==4 )
运行结果
x =
(6449*root(z^4 + (4824*z^3)/457 + (11844*z^2)/457 - (14256*z)/457 - 54108/457, z, 1)^2)/7380 + (457*root(z^4 + (4824*z^3)/457 + (11844*z^2)/457 - (14256*z)/457 - 54108/457, z, 1)^3)/3690 - (6*root(z^4 + (4824*z^3)/457 + (11844*z^2)/457 - (14256*z)/457 - 54108/457, z, 1))/205 - 927/410
(6449*root(z^4 + (4824*z^3)/457 + (11844*z^2)/457 - (14256*z)/457 - 54108/457, z, 2)^2)/7380 + (457*root(z^4 + (4824*z^3)/457 + (11844*z^2)/457 - (14256*z)/457 - 54108/457, z, 2)^3)/3690 - (6*root(z^4 + (4824*z^3)/457 + (11844*z^2)/457 - (14256*z)/457 - 54108/457, z, 2))/205 - 927/410
(6449*root(z^4 + (4824*z^3)/457 + (11844*z^2)/457 - (14256*z)/457 - 54108/457, z, 3)^2)/7380 + (457*root(z^4 + (4824*z^3)/457 + (11844*z^2)/457 - (14256*z)/457 - 54108/457, z, 3)^3)/3690 - (6*root(z^4 + (4824*z^3)/457 + (11844*z^2)/457 - (14256*z)/457 - 54108/457, z, 3))/205 - 927/410
(6449*root(z^4 + (4824*z^3)/457 + (11844*z^2)/457 - (14256*z)/457 - 54108/457, z, 4)^2)/7380 + (457*root(z^4 + (4824*z^3)/457 + (11844*z^2)/457 - (14256*z)/457 - 54108/457, z, 4)^3)/3690 - (6*root(z^4 + (4824*z^3)/457 + (11844*z^2)/457 - (14256*z)/457 - 54108/457, z, 4))/205 - 927/410
y =
root(z^4 + (4824*z^3)/457 + (11844*z^2)/457 - (14256*z)/457 - 54108/457, z, 1)
root(z^4 + (4824*z^3)/457 + (11844*z^2)/457 - (14256*z)/457 - 54108/457, z, 2)
root(z^4 + (4824*z^3)/457 + (11844*z^2)/457 - (14256*z)/457 - 54108/457, z, 3)
root(z^4 + (4824*z^3)/457 + (11844*z^2)/457 - (14256*z)/457 - 54108/457, z, 4)
方法2 使用vpa函数求近似数值解。
程序
clc;
clear all;
syms x y
[x,y]=solve((x-2)^2+(y+2*x-3)^2==5,2*(x-3)^2+(y/ 3)^2==4 );
x = vpa(x)
y = vpa(y)
x = double(x)
y = double(y)
运行结果
x =
1.6580664770347998069049390497594
1.7362259004399598338121197151769
4.0287335406907803557776183983678
3.4828821781145475308576204296936
y =
1.8936365963298548025994430021814
-2.6929074352940121705044040780427
-4.1171266000258712039597783906018
-5.639401248099686964240293356294
x =
1.6581
1.7362
4.0287
3.4829
y =
1.8936
-2.6929
-4.1171
-5.6394
实例3
程序
clc;
clear all;
syms x a
eqn = x^3 + x^2 + a == 0;
solve(eqn, x)
运行结果
ans =
root(z^3 + z^2 + a, z, 1)
root(z^3 + z^2 + a, z, 2)
root(z^3 + z^2 + a, z, 3)
方法3 修改参数设置。
程序
clc;
clear all;
syms x a
eqn = x^3 + x^2 + a == 0;
solve(eqn, x)
%通过使用“最大度数”调用求解器,尝试获得此类方程的显式解。
% 该选项指定求解程序尝试返回显式解的多项式的最大次数。默认值为2。
% 增加这个值,可以得到高阶多项式的显式解。
% 通过将“MaxDegree”的值增加到3来求解相同的方程以获得显式解。
S = solve(eqn, x, 'MaxDegree', 3)
运行结果
S =
1/(9*(((a/2 + 1/27)^2 - 1/729)^(1/2) - a/2 - 1/27)^(1/3)) + (((a/2 + 1/27)^2 - 1/729)^(1/2) - a/2 - 1/27)^(1/3) - 1/3
- (3^(1/2)*(1/(9*(((a/2 + 1/27)^2 - 1/729)^(1/2) - a/2 - 1/27)^(1/3)) - (((a/2 + 1/27)^2 - 1/729)^(1/2) - a/2 - 1/27)^(1/3))*1i)/2 - 1/(18*(((a/2 + 1/27)^2 - 1/729)^(1/2) - a/2 - 1/27)^(1/3)) - (((a/2 + 1/27)^2 - 1/729)^(1/2) - a/2 - 1/27)^(1/3)/2 - 1/3
(3^(1/2)*(1/(9*(((a/2 + 1/27)^2 - 1/729)^(1/2) - a/2 - 1/27)^(1/3)) - (((a/2 + 1/27)^2 - 1/729)^(1/2) - a/2 - 1/27)^(1/3))*1i)/2 - 1/(18*(((a/2 + 1/27)^2 - 1/729)^(1/2) - a/2 - 1/27)^(1/3)) - (((a/2 + 1/27)^2 - 1/729)^(1/2) - a/2 - 1/27)^(1/3)/2 - 1/3
实例4 solve的使用实例
程序
clc;
clear all;
syms a b c x
eqn = a*x^2 + b*x + c == 0
S = solve(eqn)
Sa = solve(eqn,a)
syms x
eqn = x^5 == 3125;
S = solve(eqn,x)
S = solve(eqn,x,'Real',true)
syms x
eqn = sin(x) == x^2 - 1;
S = solve(eqn,x)
fplot([lhs(eqn) rhs(eqn)], [-2 2])
%通过直接调用数值求解器vpasolve并指定间隔来查找另一个解。
V = vpasolve(eqn,x,[0 2])
syms u v
eqns = [2*u + v == 0, u - v == 1];
S = solve(eqns,[u v])
S.u
S.v
expr1 = u^2;
e1 = subs(expr1,S)
expr2 = 3*v + u;
e2 = subs(expr2,S)
eqns = [3*u+2, 3*u+1];
S = solve(eqns,u)
运行结果
eqn =
a*x^2 + b*x + c == 0
S =
-(b + (b^2 - 4*a*c)^(1/2))/(2*a)
-(b - (b^2 - 4*a*c)^(1/2))/(2*a)
Sa =
-(c + b*x)/x^2
S =
5
- (2^(1/2)*(5 - 5^(1/2))^(1/2)*5i)/4 - (5*5^(1/2))/4 - 5/4
(2^(1/2)*(5 - 5^(1/2))^(1/2)*5i)/4 - (5*5^(1/2))/4 - 5/4
(5*5^(1/2))/4 - (2^(1/2)*(5^(1/2) + 5)^(1/2)*5i)/4 - 5/4
(5*5^(1/2))/4 + (2^(1/2)*(5^(1/2) + 5)^(1/2)*5i)/4 - 5/4
S =
5
警告: Unable to solve symbolically. Returning a numeric solution using vpasolve.
> In sym/solve (line 304)
In guo_20230421_16 (line 15)
S =
-0.63673265080528201088799090383828
V =
1.4096240040025962492355939705895
S =
包含以下字段的 struct:
u: [1×1 sym]
v: [1×1 sym]
ans =
1/3
ans =
-2/3
e1 =
1/9
e2 =
-5/3
S =
Empty sym: 0-by-1
>>
实例5 solve函数可以求解不等式并返回满足不等式的解
程序
clc;
clear all;
%solve函数可以求解不等式并返回满足不等式的解。解下列不等式。
syms x y
eqn1 = x > 0
eqn2 = y > 0
eqn3 = x^2 + y^2 + x*y < 1
eqns = [eqn1 eqn2 eqn3]
%将"ReturnConditions”设置为true以返回解决方案中的任何参数和解决方案的条件。
S = solve(eqns,[x y],'ReturnConditions',true);
S.x
S.y
S.parameters
S.conditions
condWithValues = subs(S.conditions, S.parameters, [7/2,1/2]);
%isAlways返回逻辑1 (true ),表示这些值满足条件。将这些参数值代入S.x和S.y,找到x和y的解。
isAlways(condWithValues)
xSol = subs(S.x, S.parameters, [7/2,1/2])
ySol = subs(S.y, S.parameters, [7/2,1/2])
运行结果
3.参考内容
[1https://ww2.mathworks.cn/help/symbolic/sym.solve.html;jsessionid=476bd2cb441b759c3d4ebd88747b
[2] CSDN博主有些时候甚至幼稚的文章《Matlab 使用solve求解方程,出现未知数z和root》,文章链接为:
https://blog.csdn.net/jyfan0806/article/details/86613224
本文内容来源于网络,仅供参考学习,如内容、图片有任何版权问题,请联系处理,24小时内删除。
作 者 | 郭志龙
编 辑 | 郭志龙
校 对 | 郭志龙