Matlab解方程(方程组)

更新时间:2023-04-27 03:20:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

Matlab 解方程

这里系统的介绍一下关于使用Matlab求解方程的一系列问题,网络上关于Matlab求解方程的文章数不胜数,但是我大体浏览了一下,感觉很多文章都只是零散的介绍了一点,都只给出了一部分Matlab函数例子,以至于刚接触的人面对不同文章中的不同函数一脸茫然,都搞不清楚这些函数各自的用途,也不知道在什么样的情况下该选择哪个函数来求解方程,在使用Matlab解方程时会很纠结。不知道读者是否有这样的感觉,反正我刚开始接触时就是这样的感觉,面对网络搜索到一系列函数都好想知道他们之间是个什么关系。

所谓的方程就是含有未知数的等式,解方程就是找出使得等式成立时的未知数的数值。

求方程的解可以转换成不同形式,比如求函数的零点、多项式的根。方程分类很多,按照未知数个数分为一元、二元、多元方程;按照未知数组合形式分为线性方程和非线性方程;按照非零项次数是否一致分为齐次方程和非齐次方程。线性方程就是方程中未知数次数是一次的,未知数之间不存在指、对、2及以上幂次的关系,线性方程又分为一元线性方程,也就是一元一次方程;多元线性方程,也就是多元一次方程,多以线性方程组的形式出现(包括齐次线性方程组和非齐次线性方程组)。在Matlab中求解方程的函数主要有roots、solve、fzero、和fsolve函数等,接下来详细的介绍一下各个Matlab函数的使用方法和使用场合。

一、直接求解法(线性方程组)

直接求解法不需要借助任何的Matlab函数,主要用于求解线性方程组,也就是未知数次数是一次的方程组,包括齐次线性方程组合非齐次线性方程组。当然既然可以求解方程组自然也就可以求解单个方程。主要针对A x=b形式的方程,其中A是未知数系数矩阵,x是未知数列向量,b是常数列向量,当b=0时就是齐次线性方程组,b ≠0时是非齐次线性方程组。用左除法,

x=A\b

例:求解线性方程组的解

12341242341234251357926

640

x x x x x x x x x x x x x x +-+=??-+=-??+-=??+--=? 解:

即直接利用b 左除以A 。

运行得到结果:

二、roots 函数求多项式的根

多项式是指式中变量(未知数)就一个,未知数次数是一次及以上的式子,刑如:

110n n n p x p x p ++++=L

利用roots 函数求解此类方程(多项式)的根的格式是: x =roots(p )

其中p 是多项式系数,由高次到低次,缺的项用0表示(不能空缺),共n+1项。

例1:求解方程(多项式)的根

23240x x --=

解:

运行后得到结果:

例2:求解4次方程的根

410

x-=

解:

运行后得到结果:

关于roots函数还有两个函数经常和其一起使用,这就是poly2sym和sym2poly函数,其中poly2sym是将一个行向量(多项式系数)转化成一个多项式,而sym2poly是提取多项式系数,而且不要求这个多项式是按从高次到低次排列的。

poly2sym

例3:

运行以后到结果:

sym2poly

例4:

运行以后得到结果:

例5:

运行以后得到结果:

可见使用sym2poly提取多项式系数的时候不需要将多项式从高次到低次排列。

这样在求解方程(多项式)

452

++-+=

x x x x

29430

的根时就可以这样写程序:

运行以后就可得到结果

另外与roots 函数功能相反的一个函数是poly 函数,roots 函数是根据多项式系数求多项式的根,而poly 函数是根据多项式的根去求多项式系数,也可以用作求矩阵的特征多项式。使用时调用格式如:

p=poly(x )

p=poly(A)

其中p=poly(x)是用于根据根求多项式系数,x 是已知多项式根;p=poly(A)用于求矩阵的特征多项式。

例6:已知一个多项式的根是x 1=11.6219,x 2=-0.311+2.67i , x 3=-0.311-2.67i ,求该多项式的表达式是多少?

解:

运行以后得到结果:

即所需要的多项式表达式是:

3210.99990.001184.00030x x x ---=

例7:求一个矩阵的特征多项式,已知矩阵A 如下:

123456780A ????=??????

解:

运行以后得到结果:

故就可得到矩阵A 的特征多项式是:

32672270λλλ---=

这样再利用roots 函数输入特征多项式系数p 就可以求得矩阵A 的特征值。

三、求方程的符号解(solve 函数)

solve 函数可用于求解线性方程的根,也可以用于求解非线性方程的根,也可以用于求解带有符号常数方程的根。具体调用格式如下: ① x=solve(eqn,var)

② [x,y]=solve(eqn1,enq2,var1,var2)

③ [x,params,conds]=solve(eqns,vars ,‘ReturnConditions ’,true)

其中eqn 是待求方程,var 是自变量,也就是未知数,parameters 是解中的常数,conditions 是常数的取值。

注意在2018版本之前的Matlab 中solve 函数支持

x=solve(‘方程1’, ’方程2’, … , ’自变量1’,‘自变量2’) 的调用格式,即可以直接在solve 函数中输入方程表达式和自变量,不需要事先定义自变量,将方程和变量用单引号括起来就行,但是在后继版本中不再支持这样的调用格式,而是自变量需要先用syms 函数进行定义。

例1:求解方程sin(x)=1的一个解。

不再支持x=solve(‘sin(x)==1’,’x’)这样的调用格式,正确的使用格式是这样:

解:

或则:

运行以后都可以得到如下结果:

如果是要求方程sin(x)=1的通解的话就用③调用格式。

例2:求方程sin(x)=1的全部解。

运行以后得到结果:

即解为

22x k π

π=+

k 是常数,k 的取值是所有整数

solve 函数还可以用来求解方程组,且方程可以是非线性的: 例3:求解下面方程组的解:

2220

1x y x y ?+=?-=?

解:

运行以后可得到结果:

利用solve函数还可以求解带符号常量的方程,

例4:求解一元二次方程ax2+bx+c=0, (a≠0)的通解。

解:

运行以后得到结果

四、求方程的数值解(fzero函数和fsolve函数)

(一)、fzero函数求函数的零点

solve函数可用于求解方程的通解,方程中和解中都可以含有符号常数。针对函数在某一点的解,也就是函数零点,可用fzero函数来求解,调用格式如下:

值得注意的是solve函数针对的是方程equ,而fzero函数和fsolve函数针对的是函数fun,所以solve函数调用时需要利用syms 函数定义自变量x,而fzero函数和fsolve函数不需要syms定义自变量,可以是function编写的函数,也可以是匿名函数。

x=fzero(fun,x0)

其中fun是要求函数,x0是起始值,所代表的意思就是求出函数

fun距离x0最近的那一个零点,一个函数fun可能不止一个零点,但是fun函数只会给出距离x0最近的那个零点。

例1:求出函数发f(x)=sin x在3附近的零点,也就是sin x=0在3附近的解。

解:

运行以后得到结果:

fzero函数还可以求解在一段区间内函数的零点,

例2:求解函数f(x)=cos x在区间[1 2]内的零点。

解:

运行以后得到结果:

另外fzero函数求解的函数还可以是用function编写的函数文件:例3:求解函数f(x)=x3-2x-5在2附近的零点。

解:先编写一个函数文件,文件名要求和函数名相同。

保存该函数文件,并将文件名命名为f.m

在脚本文件中编写求解零点程序如下:

运行以后就可以得到f(x)在2附近的零点:

注意:fzero 函数求解函数零点原理是在一段区间内判断两个端点函数值是否异号,最后无限逼近零点,所以对于一个函数零点其两端不存在异号函数值时是求不出该函数零点的。例如用fzero 函数不能求出函数f (x )=x 2的零点0.

(二)、fsolve 函数求方程的数值解

fsolve 函数是比fzero 函数更为精确的函数,在应solve 函数求不出一些复杂函数的解时,考虑用fsolve 函数可以求出其数值解。其调用格式如下:

x =fsolve(fun,x 0)

例:求解下面方程组在x 1=0,x 2=0附近的解。

()

122211221(1)1cos()sin()2

x x e e x x x x x x -+-?=+??+=?? 解:先编写一个函数文件并保存,文件名和函数名一致

再在脚本文件中利用发solve 函数调用该函数就可求得解

运行以后得到结果如下:

总结:

对于线性方程组A x =b 形式可以直接利用左除法x =A\b 求解,也可以利用solve 函数来求解。 对于非线性方程中多项式方程,110n n n p x p x p ++++=L 可以利用roots 函数求解,但是未知数只有一个,也就是一元的多项式方程,配合sym2poly 函数和poly2sym 函数使用,poly 函数是和roots 函数相反功能的函数。

对于非线性方程的通解,含有符号常数的方程(组)或则一般方程(组)通解的求解利用solve 函数,当然也可以求解线性方程。 对于一个非线性方程零点的求解(数值解),(要求该零点左右两侧函数值异号),利用fzero 函数。

对于复杂非线性方程组的数值解,利用solve 函数和fzero 函数难以求解的方程(组)的数值解,利用fsolve 函数求解。

本文来源:https://www.bwwdw.com/article/22rq.html

Top