MATLAB用solve()解方程组(附带实例)
从学习代数开始,就一直在探索关于方程的求解理论,从最初的代入消元法和加减消元法,到数值计算中的牛顿迭代法、高斯消元法,一直到微分方程的求解理论,方程在数学中的重要性就包含在这漫长的探索、深化过程中。
由于代数方程只涉及符号对象的代数运算,所以相对比较简单。它还可以细分为线性方程和非线性方程两类。前者往往可以很容易地求得所有解;但是后者经常丢掉一些解,这时就必须借助函数绘制图形,通过图形来判断方程解的个数。
这里所讲的一般代数方程包括线性方程、非线性方程和超越方程等,求解函数是 solve()。当方程组不存在符号解而又无其他自由参数时,solve() 将给出数值解。
solve() 的调用格式如下:
对于上面的 4 种调用格式,输出的解有以下 3 种情况:
【实例】符号代数方程求解示例。在命令行窗口中输入以下语句,并显示相应的输出结果。
继续在命令行窗口中输入以下语句,并显示相应的输出结果:
继续在命令行窗口中输入以下语句,并显示相应的输出结果:
继续在命令行窗口中输入以下语句,并显示相应的输出结果:
继续在命令行窗口中输入以下语句,并显示相应的输出结果:
由于代数方程只涉及符号对象的代数运算,所以相对比较简单。它还可以细分为线性方程和非线性方程两类。前者往往可以很容易地求得所有解;但是后者经常丢掉一些解,这时就必须借助函数绘制图形,通过图形来判断方程解的个数。
这里所讲的一般代数方程包括线性方程、非线性方程和超越方程等,求解函数是 solve()。当方程组不存在符号解而又无其他自由参数时,solve() 将给出数值解。
solve() 的调用格式如下:
- g=solve(eq):eq 可以是符号表达式或不带符号的字符串。该函数用于求解方程 eq=0,其自变量采用默认变量,可以通过函数 findsym() 确定。
- g=solve(eq, var):求解方程 eq=0,其自变量由参数 var 指定。其中 eq 和上一种调用方式的相同。返回值 g 是由方程的所有解构成的列向量。
- g=solve(eq1, eq2, …, eqn):求解由符号表达式或不带符号的字符串 eq1,eq2,…,eqn 组成的方程组。其中的自变量为整个方程组的默认变量,即将函数 findsym() 作用于整个方程组时返回的变量。
- g=solve(eq1, eq2, …, eqn, var1, var2, …, varn):求解由符号表达式或不带等号的字符串 eq1,eq2,…,eqn 组成的方程组,其自变量由输入参数 var1,var2,…,varn 指定。
对于上面的 4 种调用格式,输出的解有以下 3 种情况:
- 对于单个方程单个输出参数的情况,将返回由多个解构成的列向量。
- 对于有与方程数目相同的输出参数的情况,方程组的解将分别赋给每个输出参数,并按照字母表的顺序排列。
- 对于只有一个输出参数的方程组,它的解将以结构矩阵的形式赋给输出参数。
【实例】符号代数方程求解示例。在命令行窗口中输入以下语句,并显示相应的输出结果。
>> clear >> syms a b c x; >> f=sym(a*x+b*x^-1+c) f = c + a*x + b/x >> solve(f) ans = -(c + (c^2 - 4*a*b)^(1/2))/(2*a) -(c - (c^2 - 4*a*b)^(1/2))/(2*a)
继续在命令行窗口中输入以下语句,并显示相应的输出结果:
>> syms a b c x; >> f=sym(a*x^2+b*x+c) f = a*x^2 + b*x + c >> solve(f,x) ans = -(b + (b^2 - 4*a*c)^(1/2))/(2*a) -(b - (b^2 - 4*a*c)^(1/2))/(2*a) >> solve(f,a) ans = -(c + b*x)/x^2
继续在命令行窗口中输入以下语句,并显示相应的输出结果:
clear syms x y; f1=sym(x^2+y^2==25) f1 = x^2 + y^2 == 25 f2=sym(x*y==12) f2 = x*y == 12 [x,y]=solve(f1,f2) x = -3 -4 4 3 y = -4 -3 3 4
继续在命令行窗口中输入以下语句,并显示相应的输出结果:
>> clear >> syms x y a b; >> f1=sym(x^2+y^2==a^2) f1 = x^2 + y^2 == a^2 >> f2=sym(x*y==b) f2 = x*y == b >> S=solve(f1,f2,x,y) S = 包含以下字段的 struct: x: [4x1 sym] y: [4x1 sym]
继续在命令行窗口中输入以下语句,并显示相应的输出结果:
>> S.x ans = -((a^2/2 - (-(- a^2 + 2*b)*(a^2 + 2*b))^(1/2))^(1/2)/2)^(3/2) - a^2*(a^2/2 - (-(- a^2 + 2*b)*(a^2 + 2*b))^(1/2)/2)^(1/2))/b -((a^2/2 + (-(- a^2 + 2*b)*(a^2 + 2*b))^(1/2)/2)^(3/2) - a^2*(a^2/2 + (-(- a^2 + 2*b)*(a^2 + 2*b))^(1/2)/2)^(1/2))/b ((a^2/2 - (-(- a^2 + 2*b)*(a^2 + 2*b))^(1/2)/2)^(3/2) - a^2*(a^2/2 - (-(- a^2 + 2*b)*(a^2 + 2*b))^(1/2)/2)^(1/2))/b ((a^2/2 + (-(- a^2 + 2*b)*(a^2 + 2*b))^(1/2)/2)^(3/2) - a^2*(a^2/2 + (-(- a^2 + 2*b)*(a^2 + 2*b))^(1/2)/2)^(1/2))/b >> S.y ans = (a^2/2 - (-(- a^2 + 2*b)*(a^2 + 2*b))^(1/2)/2)^(1/2) (a^2/2 + (-(- a^2 + 2*b)*(a^2 + 2*b))^(1/2)/2)^(1/2) -(a^2/2 - (-(- a^2 + 2*b)*(a^2 + 2*b))^(1/2)/2)^(1/2) -(a^2/2 + (-(- a^2 + 2*b)*(a^2 + 2*b))^(1/2)/2)^(1/2)