在使用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小時内删除。
作 者 | 郭志龍
編 輯 | 郭志龍
校 對 | 郭志龍