利用Mathematica软件实现线性方程组求解

合集下载

mathematica使用指南

mathematica使用指南

mathematica使用指南Mathematica是一款功能强大的数学软件,具备广泛的应用领域,包括数学、统计学、物理学、工程学等等。

本文将为您提供一份Mathematica的使用指南,帮助您快速入门并提高使用效率。

1. Mathematica简介Mathematica是由Wolfram Research公司开发的一款通用计算软件,它具备数值计算、符号计算、图形绘制等多种功能。

Mathematica基于Wolfram Language语言,用户可以直接在其中编写代码进行计算和分析。

2. 安装与启动首先您需要从Wolfram Research公司官方网站下载Mathematica安装文件,并按照安装向导完成安装过程。

安装完成后,您可以在计算机上找到Mathematica的启动图标,点击即可启动该软件。

3. Mathematica界面介绍Mathematica的主界面由菜单栏、工具栏、输入区域和输出区域组成。

菜单栏提供了各种功能选项,工具栏包含常用工具按钮,输入区域用于输入代码,而输出区域用于显示计算结果。

4. 基本计算在输入区域中,您可以直接输入数学表达式进行计算。

例如,输入"2 + 3",然后按下Enter键即可得到计算结果"5"。

Mathematica支持基本的算术运算、三角函数、指数函数等数学操作。

5. 变量与函数您可以使用Mathematica定义变量并进行计算。

例如,输入"x = 2",然后再输入"y = x^2",按下Enter键后,变量y会被赋值为2的平方,即4。

定义的变量可以在后续计算中使用。

6. 图形绘制Mathematica提供了丰富的图形绘制功能。

您可以使用Plot函数绘制函数曲线,使用ListPlot函数绘制离散数据点,还可以绘制3D图形等等。

通过调整参数和选项,您可以自定义图形的样式和外观。

Mathematica教程用Mathematica求解线性代数基本问题

Mathematica教程用Mathematica求解线性代数基本问题

Module[{x,y,...},body] Module[{x=x0,y=y0,…},body] lhs:=Module[vars,rhs/:cond] Block[{x,y,... },body] Block[{x=x0,y=y0,…},bddy]
具有局部变量x,y… 的模块
具有初始值的局部变 量的模块 rhs和cond共享局部 变量 运用局部值x,y, …计 算body 给x,y,..赋初始值
Do循环结构
Do[expr,{i,imax}] 循环计算expr,以步长1,i从 1增加到imax
循环计算expr,以步长di,i Do[expr,{i,imin,imax,di}] 从imin增加到imax Do[expr,{n}] 循环计算expr n次



键入
t0={{1,2,3},{4,5,6}}
则得到一个名为t0的2行3列的矩阵。
• 2、也可利用工具栏或菜单输入矩阵 • 点击工具栏上的矩阵输入的工具,就会得到一个 二行二列的矩阵输入框,若不是二行二列的矩阵, 可通过按Ctrl+Enter键增加一行,按Ctrl+,键增加 一列,用鼠标选定一行(或一列),按Del键可删 除一行(或一列)。通过这样的操作,就可输入任 意一个矩阵。下面的图演示了这个过程。
Out[5]=True
ln[6]:=TrueQ[x==y]
Out[6]=false
用“===”可直接测试两个表达式的等同性:
In[7]:=x===y
Out[7]:=False
一般情况下,“===”返回值为真(True)或假(False), 而“==”为符号形式输出,表示一个符号等式。 在 特殊情况下可用“===”测试一个表达式的 结构,而用“==”测试数学上的等同性。

数学实验综合实验报告

数学实验综合实验报告

一、实验目的:1、初步认识迭代,体会迭代思想的重要性。

2、通过在mathematica 环境下编写程序,利用迭代的方法求解方程的根、线性方程组的解、非线性方程组的解。

3、了解分形的的基本特性及利用mathematica 编程生成分形图形的基本方法, 在欣赏由mathematica 生成的美丽的分形图案的同时对分形几何这门学科有一个直观的了解。

从哲理的高度理解这门学科诞生的必然性,激发读者探寻科学真理的兴趣。

4、从一个简单的二次函数的迭代出发,利用mathematica 认识混沌现象及其所 蕴涵的规律。

5、.进一步熟悉Mathematic 软件的使用,复习总结Mathematic 在数学作图中的应用,为便于研究数学图像问题提供方便,使我们从一个新的视角去理解数学问题以及问题的实际意义。

6、在学习和运用迭代法求解过程中,体会各种迭代方法在解决问题的收敛速度上的异同点。

二、实验的环境:学校机房,mathematica4环境三、实验的基本理论和方法:1、迭代(一)—方程求解函数的迭代法思想:给定实数域上光滑的实值函数)(x f 以及初值0x 定义数列1()n n x f x +=, ,3,2,1,0=n , (1)n x , ,3,2,1,0=n ,称为)(x f 的一个迭代序列。

(1)方程求根给定迭代函数)(x f 以及初值0x 利用(1)迭代得到数列n x , ,3,2,1,0=n .如果数列收敛到某个*x ,则有)(**x f x =. (2)即*x 是方程)(x f x =的解。

由此启发我们用如下的方法求方程0)(=x g 的近似解。

将方程0)(=x g 改写为等价的方程)(x f x =, (3) 然后选取一初值利用(1)做迭代。

迭代数列n x 收敛的极限就是方程0)(=x g 的解。

为了使得迭代序列收敛并尽快收敛到方程0)(=x g 的某一解的条件是迭代函数)(x f 在解的附近的导数将的绝对值尽量小,因此迭代方程修订成x x f x h x )1()()(λλ-+== (4) 选取λ使得|)(|x h '在解的附近尽量小. 为此, 我们可以令,01)()(=-+'='λλx f x h得)(11x f '-=λ. 于是 1)()()(-'--=x f x x f x x h . 特别地,如果取x x g x f +=)()(, 则可得到迭代公式 .,1,0,)()(1 ='-=+n x g x g x x n n n n (5) (2)线性方程组的数值解的迭代求解理论与矩阵理论给定一个n 元线性方程组⎪⎩⎪⎨⎧=++=++,,1111111n n nn n n n b x a x a b x a x a (6)或写成矩阵的形式,b Ax = (7) 其中)(ij a A =是n 阶方阵,T n x x x x ),,(21 =及T n b b b b ),,,(21 =均为n 维列向量.熟知,当矩阵A 的行列式非零时,以上的方程组有唯一解.如何有效,快速地寻求大型的线性方程组的数值解释科学工程计算中非常重要的任务.而迭代法常常是求解这些问题的有效方法之一。

用迭代法求解方程及线性方程组。

用迭代法求解方程及线性方程组。

实验题目:用迭代法求解方程及线性方程组。

实验问题:函数的迭代是数学研究中的一个非常重要的思想工具。

哪怕是对一个相当简单的函数进行迭代,都可以产生异常复杂的行为,并由此而衍生了一些崭新的学科分支,如分形和混沌。

同时,迭代在各种数值计算算法以及其他学科领域的诸多算法中处于核心的地位。

首先,我们来探讨利用迭代求解方程的近似解。

实验目的:1. 学会基本Mathematica 语句并用其解决实际问题。

2. 了解Mathematica 系统 。

3. 用Mathematica 解决在求方程解的迭代过程。

1.方程求解给定实数域上光滑的实值函数f(x)以及初值0x 定义数列,,1,0),(1 ==+n x f x n n (1) ,,1,0, =n x n 称为f (x )的一个迭代序列。

给定迭代函数f(x)以及一个初值0x 利用(1)迭代得到数列,,1,0, =n x n 如果数列n x 收敛于一个*x ,则有)(**x f x = (2) 即*x 是方程x=f(x)的解。

由此启发我们用如下的方法球方程g(x)=0的近似解。

将方程g(x)=0改写为等价的方程x=f(x), (3) 然后选取一初值利用(1)做迭代。

迭代数列n x 收敛的极限就是方程g(x)=0的解。

用上述方程求方程的根的一个首要问题是迭代是否收敛?经过试验我们知道,使得迭代序列收敛并尽快收敛到方程g(x)=0的某一解的条件是迭代函数f(x)在解的附近的导数的绝对值近两小。

这启发我们将迭代方程修改成x x f x h x )1()()(λλ-+== (4) 我们需要选取λ使得01)('|)('|=-+=λλx f x h得)('11x f -=λ 于是1)(')()(---=x f xx f x x h特别地,如果f(x)=g(x)+x ,则我们得到迭代公式.,1,0,)(')(1 =-=+n x x n n x g x g n n (5) 2.线性方程组的迭代求解给定一个n 元线性方程组⎪⎩⎪⎨⎧=++=++n n nn nn n n b x a x a b x a x a 111111 (6)或写成距阵的形式Ax=b, (7)其中)(ij a A =是n 阶方程,T n x x x ),,(1 = 及T n b b b ),,(1 =均为n 维列向量。

mathematica计算方程组

mathematica计算方程组

mathematica计算方程组使用Mathematica计算方程组方程组是数学中的一个重要概念,它由多个方程组成,表示多个未知数之间的关系。

解方程组是数学中的基本问题之一,它在各个学科领域都有广泛的应用。

在解决实际问题时,我们经常会遇到需要求解方程组的情况,这时候我们可以借助计算工具来帮助我们进行计算。

Mathematica是一款强大的数学软件,它提供了丰富的函数和工具,可以方便地进行方程组的求解和计算。

Mathematica提供了多种方法来求解方程组,其中最常用的方法之一是使用Solve函数。

Solve函数可以求解一般的多项式方程组,也可以求解包含特殊函数的方程组。

例如,我们可以使用Solve函数来求解以下方程组:方程1: 2x + 3y = 7方程2: 5x - 2y = 1我们可以使用以下代码来求解这个方程组:```Solve[{2x + 3y == 7, 5x - 2y == 1}, {x, y}]```运行以上代码后,Mathematica会给出方程组的解:```{{x -> 17/19, y -> 11/19}}```这表示方程组的解为x等于17/19,y等于11/19。

除了使用Solve函数,Mathematica还提供了其他求解方程组的函数,如Reduce函数、NSolve函数等。

这些函数在不同的情况下有不同的优势和适用范围,可以根据具体的需求选择合适的函数来求解方程组。

除了求解方程组,Mathematica还可以进行方程组的符号计算和数值计算。

符号计算是指在不确定具体数值的情况下,对方程组进行代数运算和推理。

Mathematica可以对方程组进行简化、展开、因式分解等操作,帮助我们理解方程组的性质和特点。

数值计算是指对方程组进行数值近似计算,得到方程组的数值解。

Mathematica 可以使用数值方法对方程组进行求解,得到方程组的近似解。

这对于复杂的方程组或无法求得精确解的方程组非常有用。

第三讲用Mathematica解方程

第三讲用Mathematica解方程
例: Series[Sin[x],{x,0,10}]
Solve[{f1[x,y]==0,f2[x,y]==0,{x,y}]
如:

解aa21xxb b Nhomakorabea1y 2y
c1。 c2
命令:Solve[ {a1*x+b1*y == c1, a2*x+b2*y == c2}, {x,y}]
一般的线性方程也可以用矩阵形式表示
命令: {{3,1},{2,-5}}.{x,y}=={7,8} Solve[%,{x,y}]
用Mathematica的相应功能解方程
在Mathematica中用于解方程 f(x)=0的命令
求解联立方程 微分方程
在Mathematica中用于解方程f(x)=0的命令
Solve[ f[x] == 0,x ] NSolve[ f[x] == 0,x ]
Roots[ f[x] == 0,x ]
y(1) 2e
命令: DSolve[{x*y’[x]+2y[x]==Exp[x],y[1]==2E},y[x],x]
幂级数展开与求和
Sum[表达式,{n,n0,n1,n2}] n从n0->n1,步长为n2,省略n2表示步长为1
例:Sum[2^n,{n,0,6}] Series[函数,{变量,展开点,展开阶数}]
命令:Solve[ 2ab+2ax+2bx-3abx+2a^2-3ax^2+abx^2 – 3x^3+4x^3+bx^3+x^4==0, x]
如: 求方程x3 x2 ax b 0的解。 命令:Solve[ x^3+x^2+a*x+b==0, x]
Nsolve[ ]

用数学软件Mathematica做线性代数

用数学软件Mathematica做线性代数

用数学软件Mathematica做线性代数作者:***四川大学数学学院****************目录前言第一章行列式行列式Det[A]克拉默法则第二章矩阵及其运算矩阵的线性运算矩阵的乘法A.B矩阵的转置Transpose[A]逆矩阵Inverse[A]矩阵方程第三章矩阵的初等变换与线性方程组矩阵的行最简形RowReduce[A]矩阵的秩MatrixRank[A]齐次线性方程组基础解系NullSpace[A]非齐次线性方程组求特解LinearSolve[A,b]用Solve求线性方程组的解第四章向量组的线性相关性向量的线性表示极大无关组第五章相似矩阵及二次型正交矩阵矩阵的特征值Eigenvalues[A]矩阵的特征向量Eigenvectors[A]矩阵的对角化矩阵的正交化Orthogonalize[P]二次型的标准化参考文献前言Mathematica是著名的数学软件,具有强大的的数学运算能力和绘图功能。

本文档用Mathematica来进行线性代数中的各种运算。

本文档中所有的例子都是用Mathematica 7编程和计算的,有的命令在版本较低的Mathematica可能无法执行。

另外,有的运算结果拷贝到Word时,格式有些变化,但是在Mathematica中的输出格式没有问题。

如有对本文档中的内容任何问题,请发邮件与作者讨论。

邮箱:****************xuxz2010-9-4返回目录第一章 行列式行列式 Det[A]例 计算三阶行列式124221342A -=---(同济5版,3页)输入:A={{1,2,-4},{-2,2,1},{-3,4,-2}};Det[A]输出:-14例 计算四阶行列式3112513420111533A ---=---(同济5版,12页) 输入:A={{3,1,-1,2},{-5,1,3,-4},{2,0,1,-1},{1,-5,3,-3}};Det[A]输出:40例 求解方程211123049x x =(同济5版,3页) 输入:A:={{1,1,1},{2,3,x},{4,9,x^2}}Solve[Det[A] 0,x]输出:{{x →2},{x →3}}例 计算行列式2324323631063ab c d aa b a b c a b c da ab a b ca b c d a a b a b c a b c d++++++++++++++++++(同济5版,13页)输入:A={{a,b,c,d},{a,a+b,a+b+c,a+b+c+d},{a,2a+b,3a+2b+c,4a+3b+2c+d},{a,3a+b,6a+3b+c,10a+6b+3c+d}};A//MatrixForm (给出A 的矩阵形式)Det[A]输出:(\[NoBreak]{{a, b, c, d},{a, a+b, a+b+c, a+b+c+d},{a, 2 a+b, 3 a+2 b+c, 4 a+3 b+2 c+d},{a, 3 a+b, 6 a+3 b+c, 10 a+6 b+3 c+d}}\[NoBreak]) (给出A 的矩阵形式)a 4例 计算行列式000000000000000000000000a b a b a b c d c dc d (同济5版,15页)输入:A={{a,0,0,0,0,b},{0,a,0,0,b,0},{0,0,a,b,0,0},{0,0,c,d,0,0},{0,c,0,0,d,0},{c,0,0,0,0,d}};A//MatrixFormDet[A]Factor[%](将结果因式分解)输出-b 3 c 3+3 a b 2 c 2 d-3 a 2 b c d 2+a 3 d 3-(b c-a d)3例计算范德蒙行列式1234522222123453333312345444441234511111x x x x xx x x x xx x x x xx x x x x(同济5版,18页)输入:Van=Table[x[j]^k,{k,0,4},{j,1,5}]%//MatrixFormDet[Van]输出:{{1,1,1,1,1},{x[1],x[2],x[3],x[4],x[5]},{x[1]2,x[2]2,x[3]2,x[4]2,x[5]2},{x[1]3,x[2]3,x[3 ]3,x[4]3,x[5]3},{x[1]4,x[2]4,x[3]4,x[4]4,x[5]4}}(\[NoBreak]{{1, 1, 1, 1, 1},{x[1], x[2], x[3], x[4], x[5]},{x[1]2, x[2]2, x[3]2, x[4]2, x[5]2},{x[1]3, x[2]3, x[3]3, x[4]3, x[5]3},{x[1]4, x[2]4, x[3]4, x[4]4, x[5]4}}\[NoBreak])x[1]4 x[2]3 x[3]2 x[4]-x[1]3 x[2]4 x[3]2 x[4]-x[1]4 x[2]2 x[3]3 x[4]+x[1]2 x[2]4 x[3]3x[4]+x[1]3 x[2]2 x[3]4 x[4]-x[1]2 x[2]3 x[3]4 x[4]-x[1]4 x[2]3 x[3] x[4]2+x[1]3 x[2]4x[3] x[4]2+x[1]4 x[2] x[3]3 x[4]2-x[1] x[2]4 x[3]3 x[4]2-x[1]3 x[2] x[3]4 x[4]2+x[1]x[2]3 x[3]4 x[4]2+x[1]4 x[2]2 x[3] x[4]3-x[1]2 x[2]4 x[3] x[4]3-x[1]4 x[2] x[3]2x[4]3+x[1] x[2]4 x[3]2 x[4]3+x[1]2 x[2] x[3]4 x[4]3-x[1] x[2]2 x[3]4 x[4]3-x[1]3 x[2]2 x[3] x[4]4+x[1]2 x[2]3 x[3] x[4]4+x[1]3 x[2] x[3]2 x[4]4-x[1] x[2]3 x[3]2 x[4]4-x[1]2x[2] x[3]3 x[4]4+x[1] x[2]2 x[3]3 x[4]4-x[1]4 x[2]3 x[3]2 x[5]+x[1]3 x[2]4 x[3]2x[5]+x[1]4 x[2]2 x[3]3 x[5]-x[1]2 x[2]4 x[3]3 x[5]-x[1]3 x[2]2 x[3]4 x[5]+x[1]2 x[2]3x[3]4 x[5]+x[1]4 x[2]3 x[4]2 x[5]-x[1]3 x[2]4 x[4]2 x[5]-x[1]4 x[3]3 x[4]2 x[5]+x[2]4x[3]3 x[4]2 x[5]+x[1]3 x[3]4 x[4]2 x[5]-x[2]3 x[3]4 x[4]2 x[5]-x[1]4 x[2]2 x[4]3x[5]+x[1]2 x[2]4 x[4]3 x[5]+x[1]4 x[3]2 x[4]3 x[5]-x[2]4 x[3]2 x[4]3 x[5]-x[1]2 x[3]4x[4]3 x[5]+x[2]2 x[3]4 x[4]3 x[5]+x[1]3 x[2]2 x[4]4 x[5]-x[1]2 x[2]3 x[4]4 x[5]-x[1]3x[3]2 x[4]4 x[5]+x[2]3 x[3]2 x[4]4 x[5]+x[1]2 x[3]3 x[4]4 x[5]-x[2]2 x[3]3 x[4]4x[5]+x[1]4 x[2]3 x[3] x[5]2-x[1]3 x[2]4 x[3] x[5]2-x[1]4 x[2] x[3]3 x[5]2+x[1] x[2]4x[3]3 x[5]2+x[1]3 x[2] x[3]4 x[5]2-x[1] x[2]3 x[3]4 x[5]2-x[1]4 x[2]3 x[4] x[5]2+x[1]3 x[2]4 x[4] x[5]2+x[1]4 x[3]3 x[4] x[5]2-x[2]4 x[3]3 x[4] x[5]2-x[1]3 x[3]4 x[4]x[5]2+x[2]3 x[3]4 x[4] x[5]2+x[1]4 x[2] x[4]3 x[5]2-x[1] x[2]4 x[4]3 x[5]2-x[1]4 x[3] x[4]3 x[5]2+x[2]4 x[3] x[4]3 x[5]2+x[1] x[3]4 x[4]3 x[5]2-x[2] x[3]4 x[4]3 x[5]2-x[1]3 x[2] x[4]4 x[5]2+x[1] x[2]3 x[4]4 x[5]2+x[1]3 x[3] x[4]4 x[5]2-x[2]3 x[3] x[4]4x[5]2-x[1] x[3]3 x[4]4 x[5]2+x[2] x[3]3 x[4]4 x[5]2-x[1]4 x[2]2 x[3] x[5]3+x[1]2 x[2]4 x[3] x[5]3+x[1]4 x[2] x[3]2 x[5]3-x[1] x[2]4 x[3]2 x[5]3-x[1]2 x[2] x[3]4 x[5]3+x[1]x[2]2 x[3]4 x[5]3+x[1]4 x[2]2 x[4] x[5]3-x[1]2 x[2]4 x[4] x[5]3-x[1]4 x[3]2 x[4]x[5]3+x[2]4 x[3]2 x[4] x[5]3+x[1]2 x[3]4 x[4] x[5]3-x[2]2 x[3]4 x[4] x[5]3-x[1]4 x[2]x[4]2 x[5]3+x[1] x[2]4 x[4]2 x[5]3+x[1]4 x[3] x[4]2 x[5]3-x[2]4 x[3] x[4]2 x[5]3-x[1]x[3]4 x[4]2 x[5]3+x[2] x[3]4 x[4]2 x[5]3+x[1]2 x[2] x[4]4 x[5]3-x[1] x[2]2 x[4]4x[5]3-x[1]2 x[3] x[4]4 x[5]3+x[2]2 x[3] x[4]4 x[5]3+x[1] x[3]2 x[4]4 x[5]3-x[2] x[3]2x[4]4 x[5]3+x[1]3 x[2]2 x[3] x[5]4-x[1]2 x[2]3 x[3] x[5]4-x[1]3 x[2] x[3]2 x[5]4+x[1]x[2]3 x[3]2 x[5]4+x[1]2 x[2] x[3]3 x[5]4-x[1] x[2]2 x[3]3 x[5]4-x[1]3 x[2]2 x[4]x[5]4+x[1]2 x[2]3 x[4] x[5]4+x[1]3 x[3]2 x[4] x[5]4-x[2]3 x[3]2 x[4] x[5]4-x[1]2 x[3]3x[4] x[5]4+x[2]2 x[3]3 x[4] x[5]4+x[1]3 x[2] x[4]2 x[5]4-x[1] x[2]3 x[4]2 x[5]4-x[1]3x[3] x[4]2 x[5]4+x[2]3 x[3] x[4]2 x[5]4+x[1] x[3]3 x[4]2 x[5]4-x[2] x[3]3 x[4]2x[5]4-x[1]2 x[2] x[4]3 x[5]4+x[1] x[2]2 x[4]3 x[5]4+x[1]2 x[3] x[4]3 x[5]4-x[2]2 x[3]x[4]3 x[5]4-x[1] x[3]2 x[4]3 x[5]4+x[2] x[3]2 x[4]3 x[5]4结果太复杂,应化简。

mathematica迭代法解方程组

mathematica迭代法解方程组

mathematica迭代法解方程组Mathematica中可以使用NSolve或FindRoot来求解方程组,当然,也可以使用迭代法来解决。

下面介绍一种简单的迭代法求解方程组的方法。

假设我们要求解如下方程组:$$begin{cases}x^2-y+z=1y^2-z+x=2z^2-x+y=3end{cases}$$首先,我们需要将方程组转化为向量形式。

定义一个向量函数$F(mathbf{x})=begin{pmatrix}f_1(mathbf{x})f_2(mathbf{x})f_3 (mathbf{x})end{pmatrix}$,其中$f_i(mathbf{x})$表示第$i$个方程的左侧减去右侧所得到的值,即:$$begin{aligned}f_1(mathbf{x})&=x^2-y+z-1f_2(mathbf{x})&=y^2-z+x-2f_3(mathbf{x})&=z^2-x+y-3end{aligned}$$接下来,我们采用Jacobi迭代法求解该方程组。

具体步骤如下:1. 给定初值$mathbf{x}^{(0)}$和迭代次数$n$;2. 对于每个分量$x_i$,计算出它的下一步迭代值$x_i^{(k+1)}$:$$x_i^{(k+1)}=frac{1}{a_{ii}}left(b_i-sum_{jeq i}a_{ij}x_j^{(k)}ight)$$3. 将所有的分量合并成一个向量$mathbf{x}^{(k+1)}$;4. 如果达到了指定的迭代次数$n$,则停止迭代,输出当前的近似解$mathbf{x}^{(n)}$;否则返回第2步。

下面是Mathematica中实现该算法的代码:```(*定义向量函数*)f[x_List] := {x[[1]]^2 - x[[2]] + x[[3]] - 1,x[[2]]^2 - x[[3]] + x[[1]] - 2,x[[3]]^2 - x[[1]] + x[[2]] - 3}(*Jacobi迭代法求解方程组*)jacobi[x0_List, n_Integer] := Module[{x = x0},Do[x[[i]] = (1/Coefficient[f[x], x[[i]]])*(f[x][[i]] +Sum[Coefficient[f[x], x[[i]], 1]*x[[j]], {j, 1, 3}] - Coefficient[f[x], x[[i]], 0]),{k, 1, n}];x](*测试*)sol = jacobi[{0, 0, 0}, 10]f[sol] (*检验结果是否满足方程组*)```运行以上代码得到的结果为:```{0.592662, 1.39611, -1.90835}{0., 0., 0.} (*结果满足方程组*)```这里我们取初始值为$mathbf{x}^{(0)}=begin{pmatrix}000end{pmatrix}$,迭代10次后得到的近似解为$mathbf{x}^{(10)}approxbegin{pmatrix}0.59271.3961-1.9084end {pmatrix}$,同时检验结果发现其满足方程组。

利用Mathematica软件实现线性方程组求解

利用Mathematica软件实现线性方程组求解

利用Mathematica 软件实现线性方程组求解摘要:Mathematica 作为一款独特的数学软件,有强大的数值计算和符号计算能力,具有很强的实用性,而线性方程组在线性代数中具有重要的地位.针对线性方程组的解具有零解、唯一解、无穷解的情况,文章借助Mathematica 数学软件分别给出求解的算法以及如何直接调用内部函数求解线性方程组的方法.文章中主要利用高斯-约当(Gauss-Jordan )消元法、矩阵的LU 分解法求解线性方程组,并用Mathematica 软件对这两种算法予以实现.同时给出了带有可读性好的求解过程、能用于各种逆矩阵和线性方程组求解的通用程序,利用Mathematica 数学软件实现对求逆矩阵和线性方程组的可读性计算.关键字:Mathematica ;线性方程组;可读性计算;算法引言1.Mathematica 软件功能简介Mathematica 作为一款独特的数学软件,有强大的数值计算和符号计算能力.同时,线性方程组是连接矩阵和向量组的纽带,也是矩阵和向量组的直接应用.在我们的实际工作中出现的大量数学模型,他们最后都可以化为解线性方程组,所以对线性方程组的解的研究是非常重要的.在数学的许多分支中都涉及到线性方程组的问题,我们通常分齐次与非齐次两大类以及未知量个数与方程个数相等或不等对其进行求解,在系数矩阵为方阵时,还可以按照行列式是否为零进行分类.对于线性方程组的求解,其算法是非常清楚的,就是利用矩阵的行初等变换将对应的增广矩阵化为行最简矩阵,然后就可写出通解.但是由于整个过程涉及到大量数字运算,往往会因计算过程中不小心出现一些计算错误而导致错误的结论,有时甚至出现对没解的方程求出有解,或相反.然而,如果利用数学软件Mathematica ,可以将大家从繁琐的数字运算中解脱出来,而将注意力集中在基本概念和基本算法的学习上,从而增加学习兴趣,提高学习效率.笔者从事了一年多大学生创新实验《基于数学软件的高等代数解题实践研究》,通过实践发现,如果能够通过计算机编程让计算机自动求解各种线性方程组,这将是非常快速、方便的.因此本文以Mathematica 数学软件为平台,通过举例、演示与实验来理解线性方程组中的一些抽象概念和理论,并简捷直观地用计算机来解决复杂的线性方程组的求解问题,化简过难、过繁的运算技巧.本文根据Mathematica 软件强大的数值计算无误差的特点和符号计算功能,总结Mathematica 的关于线性方程组计算的功能、命令,总结了求解线性方程组的解的算法,并给出带有可读性好的求解过程、能用于各种线性方程组求解的通用程序,实现线性方程组的可读性计算.由于本章用到线性代数的许多基本知识,有必要对相关的概念和性质做一下说明. 定义1 如两个方程组具有完全相同的解,则称两个方程组为等价方程组.定义2 关于方程组的初等运算有三种类型:1) 交换方程组中两个方程:i j R R ↔,称为交换运算.2) 用一个非零的实数乘以某一方程:i i R R λ→,称为倍法运算.3) 某方程加上另一个方程的倍数:i j i R R R λ+→,称为消法运算.定理1 若一个方程由另一个方程经过有限次初等运算得到的,则这两个方程组等价.定义3 矩阵的初等变换,用i A 表示矩阵A 的第i 行,那么有:1) 交换A 的两行:i j A A ↔,称为交换变换.2) 用一个非零的实数λ乘以A 的某一行:i j A A λ→,称为倍法变换.3) 用A 某行加上另一行的λ倍:i j i A A A λ+→,称为消法表换.定义4 对矩阵A 施行初等变换,得到的矩阵称为相应的初等阵.例如23100100010001001010A A ↔⎛⎫⎛⎫ ⎪ ⎪−−−→ ⎪ ⎪ ⎪ ⎪⎝⎭⎝⎭记作23E2210010001000001001A A λλ⨯↔⎛⎫⎛⎫ ⎪ ⎪−−−−→ ⎪ ⎪ ⎪ ⎪⎝⎭⎝⎭记作()2E λ32310010001001000101A A A λλ+⨯↔⎛⎫⎛⎫ ⎪ ⎪−−−−−→ ⎪ ⎪ ⎪ ⎪⎝⎭⎝⎭记作()23E λ定理2 对矩阵施行初等变换相当于将矩阵左乘相应的初等阵.212+-210210221-101-5001001A A A ⨯→⎛⎫⎛⎫ ⎪ ⎪−−−−−−→ ⎪ ⎪ ⎪ ⎪⎝⎭⎝⎭()相当于12(-2)E A100102102-21021-1=01-5001001001⎛⎫⎛⎫⎛⎫ ⎪⎪ ⎪ ⎪⎪ ⎪ ⎪⎪ ⎪⎝⎭⎝⎭⎝⎭定理3 对任何n 阶矩阵A,以下性质等价:1) A 存在逆矩阵,即A 是可逆矩阵.2) 0A ≠,即A 是非奇异矩阵.3) A 的行向量组(列向量组)线性无关.4) 方程组AX b =有唯一解.定理4 如果矩阵A 经过一系列的初等变换化为单位阵E,则单位阵E 通过相同的初等变换化为1A -.由此得出用初等变换求矩阵逆的方法下例所示. 例1:求矩阵123133247A ⎛⎫ ⎪= ⎪ ⎪⎝⎭的逆. 解:()(2)(1)(1)(2)(3)(1)13(3)(2)13(1)(3)(3)(1)(1)(2)211231*********33010010-110247001011-201123100100010-110010001-1-110A E +-⨯→+-⨯→+-⨯→+-⨯→+-⨯→⎛⎫⎛⎫ ⎪ ⎪=−−−−−−→−−−−−−→ ⎪ ⎪ ⎪ ⎪⎝⎭⎝⎭⎛⎫ ⎪−−−−−−→ ⎪ ⎪⎝⎭()()()()()()()-161-3-110=01-1-11E A ⎛⎫ ⎪ ⎪ ⎪⎝⎭ 2 Mathematica 软件常用命令及其功能为了便于读者更好地利用Mathematica 软件解决数学问题,首先给出本文程序涉及的Mathematica 数学软件的命令及其功能.Append[expr,elem]——生成一个在表expr 的最后添加元素elem 后的表;Complement[listall, list1,list2,…]——求全集listall 对listi 的差集; Delete[expr,{i}]——删除expr 中第i 个元素后剩下的表;Do[expr,{imax}]——重复执行expr 共imax 次;Table[expr,{imax}]-—生成一个由表达式expr 产生的元素构成的共imax 个元素的表; Do[expr,{i,min,max}]——循环变量i 按步长1从min 取至max,重复执行表达式expr; Do[expr,{i,imin,imax},{j,jmin,jmax},…]——多重循环;Dot[a,b]——矩阵、向量、张量a 与b 的内积;Transpose[list]——对矩阵list 进行转置; IdentityMatrix[n]——自动生成一个n 阶单位矩阵;Insert[expr,elem,n]——在表expr 的第n 个元素前插入元素elem 产生一个新表; If[condition,t,f]——如果条件condition 为True,执行t 段,否则执行f 段;Length[expr]——表expr 中第一层元素的个数( 通常称为表的长度);LinearSolve[A,b],给出向量x,使得Ax b =成立.——求解线性方程组Ax b =的一个特解; LUBackSubstitution[数据,b]——利用LUDecomposition[矩阵A]输出的结果求解方程组矩阵.x=bLUDecomposition[A]——求出矩阵A 的LU 分解;LUMatrices[lu]——返回一个形式为{l,u}的列表;MatrixForm[expr]——按矩阵形式将表expr 输出;NullSpace[A]——求齐次线性方程组AX=0的基础解系;Print[expr1,expr2,…]——顺次输出表达式expri 的值;RowReduce[A]——将矩阵A 化为简化行梯形形式;Simplify[expr]——对表达式expr 进行化简;Solve[eqns,vars]——从方程组eqns 中解出变量vars;(*information*)--注释语句,其中information 表示对程序作说明;{a,b,c}--Mathematica 中表的结构,表示元素分别为a,b,c 的表;3线性方程组解的算法及在Mathematica 软件中的实现3.1线性方程组的解考虑线性方程组:,,,()n m m n A X b X R b R R A m ⨯=∈∈= (1)其对应的齐次线性方程组为:0AX = (2)讨论线性方程组AX b =的求解问题,式中A 为m n ⨯阶系数矩阵,b 为1m ⨯阶右端列向量,X 为待求的1n ⨯阶列向量.这里首先假定m n ≤,如果m n >留待稍后讨论.当m n =且行列式0A ≠时,称AX b =为恰定方程组;当m n <时,称AX b =为不定方程组;当m n >时,称AX b =为超定方程组;在上述方程组求解的讨论中,常常要用到系数矩阵A 的秩()R A ,与增广矩阵的秩(,)R A b ,有时还要计算对应齐次方程组0AX =的基础解系.线性方程组(1)的解有以下3个结论:线性方程组的解的基本问题:当()(,)R A R A b n ==时,(1)有唯一解;当()(,)R A R A b n =<时,(1)有无穷多组解;当()(,)R A R A b <时,(1)无解.线性方程组的解的结构问题:线性方程组(1)对应的齐次方程组(2)的基础解系由()n R A -个向量组成;(2)的通解为基础解系的任意线性组合;(1)的通解为(1)的特解与(2)的通解之和.Mathematica 软件中的命令Solve 可以直接求出方程组(不限于线性)的解,一般格式为:Solve[eqns,vars],其功能是从方程组eqns 中解出变量vars.(但对于大的方程组而言,这种方法就显得有点儿麻烦,而且效率不高.)也有专门用于求解线性方程组的命令,一般格式为:LinearSolve[A,b],给出向量x,使得AX b =成立.其功能是求解线性方程组AX b =的一个特解,此命令的缺陷是当方程组的解不唯一时,只能求出一个特解而不能求通解.其中A 是方程组的系数矩阵,而b 为线性方程组的“右边项”.如果A 为可逆阵,那么LinearSolve 就给出线性方程组的唯一解.如果A 为奇异阵,那么方程组就可能没有解,也有可能存在无穷组解.如果方程组具有唯一解,Mathematica 就会给出这个解(如例3).如果方程组没有解,Mathematica 就会返回出错信息(*Linear equation encountered which has no solution.*),即遇到了没有解的线性方程组.(如例4)例2:求解线性方程组.⎪⎩⎪⎨⎧=++=++=++147338523532321321321x x x x x x x x xA1={{2,1,3},{3,2,5},{3,3,7}};b1={5,8,14};Det[A1]=10≠,故知方程组有唯一解LinearSolve[A1,b1] (*利用Solve 函数求解11A X b =*)={-3,-4,5} (*求得解543321=-=-=x x x *)例3:求解线性方程组⎪⎩⎪⎨⎧=++=+-=++124313427233z y x z y x z y x⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡-=12171;4313422331b a a1={{3,3,2},{2,-4,3},{1,3,4}};b1={{7},{1},{12}};运行LinearSolve[a1,b1]得:231776,,701435⎧⎫⎧⎫⎧⎫⎧⎫-⎨⎨⎬⎨⎬⎨⎬⎬⎩⎭⎩⎭⎩⎭⎩⎭例4:方程组⎪⎩⎪⎨⎧=+-=+-=++1143313462z y x z y x z y x 没有解.⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡--=11162;4333411122b a a2={{2,1,1},{1,-4,3},{3,-3,4}};b2={{6},{1},{11}};运行LinearSolve[a2,b2]得:LinearSolve::nosol: Linear equation encountered that has no solution.(遇到了没有解的线性方程组)LinearSolve[{{2,1,1},{1,−4,3},{3,−3,4}},{{6},{1},{11}}]如果方程组没有解,Mathematica 就会返回出错信息(*Linear equation encountered which has no solution.*),即这是一个没有解的线性方程组.如果方程组Ax=b 有无穷组解,问题就有一些复杂了.对于这种情况,Mathematica 就会返回一个解,我们称其为特解.而所有解是由特解加上对应的齐次方程组Ax=0的所有解构成的.所有满足0AX =的向量X 全体称为A 的零空间,可以很容易地用NullSpace 命令确定出零空间的构造.NullSpace[A ]返回A 的零空间的基向量,即齐次线性方程组AX=0的基础解系.A 的零度,即A 的零空间中最大线性无关向量组的向量个数,可以通过运行Length[NullSpace[a]]得到. A的秩可以用n-Length[NullSpace[A]]算出,其中n表示A 的列数.例5:方程组2y74323349x zx y zx y z++=⎧⎪-+=⎨⎪-+=⎩有无穷组解.a={{2,1,1},{1,-4,3},{3,-3,4}};b={{7},{2},{9}};nullspacebasis=NullSpace[a]{{−7,5,9}}(*由于零向量非空,因此没有唯一解*)particular = LinearSolve[a, b]{{10/3}, {1/3}, {0}}(*这是一个特解*)方程组的完全解具有形式t*nullspacebasis+particular,其中t是任意参数.然而,为了表示成单个列表,我们必须展平nullspacebasis和particular. generalsolution = t*Flatten[nullspacebasis] + Flatten[particular]{10/3 - 7 t, 1/3 + 5 t, 9 t}作为检验的步骤,我们下面把一般解代回到原来的方程组中.a.x /. x -> {10/3 - 7 t, 1/3 + 5 t, 9 t} // Expand{7,2,9}关于线性方程组求解的算法研究已比较成熟,本文主要利用高斯-约当(Gauss-Jordan)消元法和矩阵LU分解法求解线性方程组.3.2高斯-约当(Gauss-Jordan)消元法求解线性方程组ax=b的高斯-约当方法是基于对增广矩阵[]a b的简化处理,这个过程通过初等变换把矩阵转化为简化行阶梯形的形式.基本初等行变换有下述三种:①交换两行②在一行中乘上一个非零常数③在一行中加上另一行的倍数.容易证明初等行变换对方程组的解没有影响.一个矩阵称为简化行阶梯形形式,是指①每一行中第一个非零元素都是1(称为首1)②在这个1的上面或者下面的元素都是0③对于两个首1的行,下面的行中第一个非零元素比前一个更靠右.在求解线性方程组时,我们首先应该使用初等行变换把增广矩阵转化为简化梯形形式.学过线性代数或者高等代数的读者都知道初等行变换是非常麻烦的,很容易出错.并且只要有一个地方出错,后面的计算就已经无用了.然而,Mathematica数学软件中的RowReduce命令可以自动把任意矩阵转化为简化行梯形形式.RowReduce[A]——把矩阵A 转化为简化行梯形形式.例6: 考虑3⨯4阶矩阵,其元素为ij a i j =-.a=Table[Abs[i-j],{i,1,3},{j,1,4}];a//MatrixForm⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡123012101210 RowReduce[a] //MatrixForm⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡23021100010001 下面我们演示行简化过程是怎么用于线性方程组的求解.为了便于比较,我们使用的范例采用前面的例3、例4与例5 中考虑的三个例子.例7:(a )方程组124313427233=++=+-=++z y x z y x z y x (有唯一解) (b )方程组1143313462=+-=+-=++z y x z y x z y x (无解) (c )方程组943323472=+-=+-=++z y x z y x z y x (有无穷组解)这三个方程组的增广矩阵分别为 ⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡--=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡--=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡-=9433234171123;11433134161122;12431134272331a a aa1={{3,3,2,7},{2,-4,3,1},{1,3,4,12}};a2={{2,1,1,6},{1,-4,3,1},{3,-3,4,11}};a3={{2,1,1,7},{1,-4,3,2},{3,-3,4,9}}; RowReduce[a1]//MatrixForm⎪⎪⎪⎪⎪⎪⎭⎫ ⎝⎛-357610014170107023001 (*当矩阵被简化后,如果把它看作方程组,容易看出x=-23/70,y=17/14,z=76/35*) RowReduce[a2] //MatrixForm795910001-00001⎛⎫ ⎪ ⎪ ⎪⎝⎭(*简化后的矩阵第三行指的是0001x y z ++=,这当然是不可能的.这个矛盾(一行中只有最后一个元素是非零,其余都是零)说明方程组没有解.*) RowReduce[a3] //MatrixForm7109351931001-0000⎛⎫ ⎪ ⎪ ⎪⎝⎭(底行全是0没有任何不对的地方,然而这个方程组没有唯一解,如果令z=t,其中t 为独立参数,那么方程组的解具有如下形式:10715,,3939x t y t z t =-=+=) [注释] 虽然这个解与例5给出的解在形式上稍有些不同,但从它们确定相同的解集的意义上看,它们是等价的.求解线性方程组的算法步骤为:1.对增广矩阵(非齐次)或系数矩阵(齐次)进行初等行变换,将其转化为行最简形矩阵(对非齐次线性方程组判断是否有解);2.确定非自由未知量和自由未知量,将行最简形“翻译”为方程组;3.令自由未知量等于任意常数,得到通解.3.3 矩阵的LU 分解法(Doolittle 法)LU 分解法(杜利特尔Doolittle 方法) 是另外一种经常使用的求解线性方程组的方法,尤其是当具有许多方程组,而且每个方程组的系数相同时,这种方法特别有用. LU 分解法的基本思想是这样的.如果A 为方阵,那么它可以分解为A=LU,其中L 为下三角矩阵,主对角线上元素全是1,U 为上三角矩阵.这样方程组Ax=b 就转化为(LU )x=b,其可重写为L (Ux )=b.如果令y=Ux,那么可以从Ly=b 中解出y,一旦有了y,就可以从Ux=y 中解出x.(LU)Ly b Ax b x b Ux y =⎧=⇔=⇔⎨=⎩虽然矩阵LU 分解法把一个方程组的求解转化为两个方程组的求解,但由于现在每个方程组的系数矩阵都是三角矩阵,因此计算起来速度是很快的.这样一来,如果使用LU 分解法求解线性方程组,就包含两个步骤:分解与回代.对应的Mathematica 命令就分别为LUDecomposition 与LUBackSubstitution .LUDecomposition[A]——求出矩阵A 的LU 分解;LUBackSubstitution[数据,b]——利用LUDecomposition[矩阵A]输出的结果求解方程组矩阵.x=bLUDecomposition 的输出为数据,由三部分组成:(1)矩阵L 与U 被压缩到一个矩阵中,(2)一个置换向量,以及(3)矩阵的L ∞条件数.把数据送给LUBackSubstitution 就可以求解出线1112111121421222212221212111n n n n n nn n n nn a a a r r r a a a l r r A a a a l l r ⎛⎫⎛⎫⎛⎫ ⎪ ⎪⎪ ⎪ ⎪⎪== ⎪ ⎪⎪ ⎪ ⎪⎪⎝⎭⎝⎭⎝⎭性方程组.置换向量对行进行重新安排,以保证矩阵具有最大的数值稳定性.本文不再对条件数加以讨论.LUDecomposition 与LUBackSubstitution 不能用于求解具有无穷组解的线性方程组.例8: 利用LU 分解法求解线性方程组2y 743232213x z x y z x y z ++=⎧⎪-+=⎨⎪++=⎩.为了用LU 分解法求解线性方程组,我们首先对系数矩阵进行矩阵分解.2117143;2;32213a b ⎡⎤⎡⎤⎢⎥⎢⎥=-=⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦运行Clear all;a={{2,1,1},{1,-4,3},{3,2,2}};b={{7},{2},{13}};data=LUDecomposition[a]得{{{1, -4, 3}, {2, 9, -5}, {3, 14/9, 7/9}}, {2, 1, 3}, 1}LUBackSubstitution[data,b]{{1},{2},{3}}在例9和例10中演示了LUDecomposition 返回数据的结构.例9 567131232728m ⎛⎫ ⎪= ⎪ ⎪⎝⎭;m={{5,6,7},{1,3,12},{3,27,28}};{lu,m,cond}=LUDecomposition[m]{{{1,3,12},{5,-9,-53},{3,-2,-114}},{2,1,3},1}在本例中,没有进行行置换,因为此时的置换向量p 就是{1,2,3}.LUDecomposition[m]的第一部分是以压缩形式给出的两个矩阵,因为我们已知LU 的形式为100100100x x x x x x x x x ⎡⎤⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦; 所以要想指定矩阵L 、U,只需要指定九个元素(用x 表示).在LUDecomposition[m]的第一部分就是用单个矩阵的形式给出这九个数.lu//MatrixForm234256347⎡⎤⎢⎥⎢⎥⎢⎥⎣⎦这些数虽然是组合在一个矩阵中,但每个数所在的位置却是分别与L 、U 中的位置一致的,因此100234LU 210056341007⎡⎤⎡⎤⎢⎥⎢⎥=⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦例10 211143322m ⎡⎤⎢⎥=-⎢⎥⎢⎥⎣⎦; Clear all;m={{2,1,1},{1,-4,3},{3,2,2}};{lu,p,cond}=LUDecomposition[m]{{{1, -4, 3}, {2, 9, -5}, {3, 14/9, 7/9}}, {2, 1, 3}, 1}lu//MatrixForm714991432953⎛⎫ ⎪ ⎪ ⎪⎝⎭--如果仍然按前面例子同样的步骤处理,就会得到71499100143210;095;3100l u -⎡⎤⎡⎤⎢⎥⎢⎥==-⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦ 但这时l 与u 乘起来并不等于原来的矩阵.l.u//MatrixForm143211322-⎡⎤⎢⎥⎢⎥⎢⎥⎣⎦实际上这时置换向量为p={2,1,3},表明矩阵中第一行与第二行交换了顺序.如果这时交换l 中相应的行,再乘上U 就会得到原来的矩阵.149210100;31l ⎡⎤⎢⎥=⎢⎥⎢⎥⎣⎦L.U//MatrixForm211143322⎡⎤⎢⎥-⎢⎥⎢⎥⎣⎦重构出L 与U 矩阵的更方便的方法是利用LUMatrices 命令,这条命令包含在软件包LinearAlgebra`MatrixManipulation`中.LUMatrices[lu]——返回一个列表,形式为{l,u},由对应于lu 的矩阵在LU 分解中被置换后的上三角与下三角矩阵组成,其中lu 为运行LUDecomposition[A]所得结果中的第一个元素.例11:自动求解例9中的L 、U运行<<LinearAlgebra`MatrixManipulation`调入软件包. 运行m={{2,1,1},{1,-4,3},{3,2,2}}; {lu,p,cond}=LUDecomposition[m]得数据{{{1, -4, 3}, {2, 9, -5}, {3, 14/9, 7/9}}, {2, 1, 3}, 1} 运行LUMatrices[lu] 得转换后的L 、U 矩阵{{1,0,0},{2,1,0},{3,14/9,1}},{{1,-4,3},{0,9,-5},{0,0,7/9}}} 由此可见可以自动提取转换后的L 、U 矩阵: L= LUMatrices[lu][[1]]; U= LUMatrices[lu][[2]];L[[p]]//MatrixForm (*L[[p]]根据向量p 对矩阵L 的行进行置换*)14921010031⎛⎫ ⎪ ⎪ ⎪⎝⎭U//MatrixForm7914309500-⎛⎫⎪- ⎪ ⎪⎝⎭运行下列命令,从结果可见L 与U 的乘积与原矩阵一致:L[[p]].U//MatrixForm211143322⎛⎫ ⎪- ⎪ ⎪⎝⎭例12:利用LU 分解法求解方程⎪⎪⎪⎭⎫⎝⎛=⎪⎪⎪⎭⎫ ⎝⎛-400320102423xLU 分解法的计算步骤:1.首先将方程组的系数矩阵进行LU 分解,得到A LU =.2.求解LY=b.3.求解UX=Y.(*输入数据*)A = {{3, 2, -4}, {2, 0, 1}, {0, 2, 3}}; b = {0, 0, 4};(*对A 进行LU 分解:A=LU*)Print["待求方程组为", MatrixForm[A], "x=", MatrixForm[b]]; n = Length[b];{lu, p, c} = LUDecomposition[A];Print["LU 分解的紧凑格式为", MatrixForm[lu]]; Print["置换向量为", p];l = lu SparseArray[{i_, j_} /; j < i -> 1, {n, n}] + IdentityMatrix[n]; Print["分离的L 矩阵为", MatrixForm[l]];u = lu SparseArray[{i_, j_} /; j >= i -> 1, {n, n}]; Print["分离的U 矩阵为", MatrixForm[u]]; (*求解Ly=b*)y = LinearSolve[l, b[[p]]]; Print["求解Ly=b 得:y=", y]; (*求解ux=y*)x = LinearSolve[u, y] // N; Print["方程组解为:x=", x];运行以上程序得:4线性方程组求解过程的可读性计算假设AX E =,其中A 为n 阶系数矩阵,E 为单位矩阵,即123=,,,,n E e e e e (),其中(1,2,)i e i n =为单位列向量,X 为n 个列向量构成的矩阵,即2(,,)i n X x x x =,其中,(1,2,)i x i n =为列向量.于是,可以把等式AX E =看作求解n 个线性方程组,(1,2,)i i Ax e i n ==出了所有i x 之后,也即得到了矩阵X .而由AX E =可知,矩阵X 是A 的逆矩阵,即1X A -=.这样就求出了A 的逆矩阵.于是求逆矩阵的过程被化成了解线性方程组的过程.我们利用Mathematica 软件实现对求逆矩阵的可读性计算,对我们探讨线性方程组的解法有非常重要的意义.4.1 求逆矩阵可读性计算我们编写可读性程序如下: (*求矩阵的逆矩阵*)运行InvMatr[A_] := (If[! MatrixQ[A],Print["A is not a Matrix, We don't calculate the inverse of A."], Print["Matrix A =", MatrixForm[A], ", "]; If[Det[A] == 0,Print["Because of Det[A]=0, There isn't inverse Matrix of A."], n = Length[A];ident = IdentityMatrix[n]; AT = Transpose[A]; Temp = AT;Do[Temp = Append[Temp, ident[[i]]], {i, 1, n}]; AE = Transpose[Temp];Print["(A|E)=", MatrixForm[AE]]; Do[k = Infinity; r = j;Do[ If[Abs[AE[[i, j]]] < k && AE[[i, j]] != 0, k = AE[[i, j]]; r = i], {i, j, n}];If[r != j, TempMatrix = AE[[r]]; AE[[r]] = AE[[j]]; AE[[j]] = TempMatrix];Do[AE[[i]] = AE[[i]] - AE[[j]]*AE[[i, j]]/AE[[j, j]], {i, 1, j - 1}];Do[AE[[i]] = AE[[i]] - AE[[j]]*AE[[i, j]]/AE[[j, j]], {i, j + 1, n}]; AE[[j]] = AE[[j]]/AE[[j, j]];Print["-->", MatrixForm[AE]]; , {j, 1, n} ];B = Transpose[AE]; Temp = {B[[n + 1]]};Do[Temp = Append[Temp, B[[i]]], {i, n + 2, 2 n}];Print["The Inverse Matrix A of is ", Transpose[Temp] // MatrixForm, "."] ] ] )为说明本程序可用于任何对矩阵的逆的各种情形的求解处理,举例计算如下.例13:已知a1={2,3,1,4};a2={3,0,2,5};a3={4,3,8};a4={2,7,4,15};A={a1,a2,a3,a4},求A 的逆阵. 运行Clear; a1={2,3,1,4}; a2={3,0,2,5}; a3={4,3,8}; a4={2,7,4,15}; A={a1,a2,a3,a4}; InvMatr[A]得:A is not a Matrix, We don't calculate the inverse of A. 如果我们输入的A 不是矩阵,我们不可求A 的逆阵.例14:求矩阵A=⎪⎪⎪⎪⎪⎭⎫⎝⎛64401800154012202的逆矩阵. 运行Clear;a1={2,0,2,2}; a2={1,0,4,5}; a3={1,0,0,8}; a4={1,0,4,64}; A={a1,a2,a3,a4}; InvMatr[A]得:Matrix A =⎪⎪⎪⎪⎪⎭⎫ ⎝⎛64401800154012202 Because of Det[A]=0, There isn't inverse Matrix of A.此时,A 的行列式为0,A 没有可逆阵.例15:求矩阵A=⎪⎪⎪⎭⎫ ⎝⎛--242022233的逆矩阵.Clear;a1={3,3,2};a2={2,-2,0}; a3={-2,4,2}; A={a1,a2,a3}; InvMatr[A]运行结果为:例16:求矩阵A= ⎪⎪⎪⎪⎪⎪⎭⎫⎝⎛3000023000023000023000023的逆矩阵Clear;a1={3,2,0,0,0};a2={0,3,2,0,0};a3={0,0,3,2,0};a4={0,0,0,3,2}; a5={0,0,0,0,3};A={a1,a2,a3,a4,a5}; InvMatr[A]通过上面的讨论我们可以看出该程序对任何一个矩阵型数据均能做出相应的处理,对输入的矩阵为可逆时,程序能计算出逆矩阵.进而我们通过Mathemtica 软件对解方程组也可实现可读性计算.4.2 线性方程组的可读性计算虽然Mathematica 软件中有解方程组的函数,但是,用此函数求解方程组存在不足之处:不能看到求解方程组的过程,也不能看到求解方程组的其他信息;输入方程组信息的形式繁琐且输出的内容不符合代数教材中通常的习惯,不能为其他程序提供更多的信息.而通过Mathematica 软件到底能不能对解线性方程组算法的实现将其过程展现出来呢?我们的答案是肯定的.只是在求解过程中,要运用到更多的输出形式函数.其程序相对较复杂.程序中较多的命令都是由简单命令复合而成,现对复合命名的构造过程进行描述.为了使实例17中的增广矩阵2-21-1121-42-2334-103-57812-11-2-1⎛⎫ ⎪ ⎪ ⎪⎪⎝⎭具有分块形式22111|214223|3410357|812112|1⎛⎫⎪⎪⎪ ⎪⎝⎭---------, 就需要在最后一列前插入符号“|”进行分隔,但Mathematica 中的矩阵是由行表构造而成,因此先用Transpose 命令对矩阵AUB 进行转置,并事先生成一个全由“|”为元素的一维表B0,一次性地把B0 插入到AUB 的转置矩阵的最后一行之前,然后再转置,就实现了我们希望的输出效果.完整的命令如下:B0=Table["|",{i,1,m}];MatrixForm[Transpose[Insert[Transpose[AUB],B0,n+1]]]Mathematica对表进行操作时是对表的每个元素进行同一操作,因此在对AUB 中找出的主元AUB(r,j)进行归一化处理时,可用下列命令实现对r行元素各除以AUB(r,j):AUB[[r]]=AUB[[r]]/AUB[[r,j]];为了把j 列除主元AUB(r,j)外的各元素全变成零,可对1 至r-1 行及r+1 至m 行分别进行第三类初等行变换.完整命令如下:Do[AUB[[i]]=AUB[[i]]-AUB[[r]]*AUB[[i,j]] ,{i,1,r-1}];Do[AUB[[i]]=AUB[[i]]-AUB[[r]]*AUB[[i,j]] ,{i,r+1,m}];处理解唯一时的输出时要解决的问题:AUB 的第n+1 列就是所求的解,但当m>n 时由于方程个数比未知量个数多,直接输出AUB(n+1)将出现多余的0,因此先把这些0 的位置存入表dele 中,再用Delete 命令把AUB(n+1)中多余的0 删除;为了把行向量以列的方式输出,由于Transpose 对一维表无效,因此把删除多余元素后的表放在{}中以增加其维数,最后形成的完整命令如下:dele=Table[{i},{i,n+1,m}];MatrixForm[Transpose[{Delete[Transpose[Simplify[AUB]][[n+1]], dele]}]]]下面是经过完整的求解线性方程组的可读性计算的完整程序:conslist = {C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13,C14, C15, C16, C17, C18, C19, C20, C21, C22, C23, C24, C25};varlist = {x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13,x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25}; MatrixPrint[A_] := (B0 = Table["|", {i, 1, m}];MatrixForm[Transpose[Insert[Transpose[AUB], B0, n + 1]]])PrintSolve[] := (ME = IdentityMatrix[S];basV = Complement[Table[i, {i, 1, n}], fuq];L = Length[basV];(*L 记录基变量的个数*)AUB = Transpose[AUB];eta = Table["", {S}];i = 0; eta[[i]] = AUB[[n + 1]];eta[[i]] = Table[eta[[i]][[j]], {j, 1, L}];Do[eta[[i]] = Insert[eta[[i]], 0, fuq[[k]]], {k, 1, S}];Do[eta[[i]] = -AUB[[fuq[[i]]]];eta[[i]] = Table[eta[[i]][[j]], {j, 1, L}];Do[eta[[i]] = Insert[eta[[i]], ME[[i, k]], fuq[[k]]], {k, 1,S}], {i, 1, S}];Ck = Table[conslist[[i]], {i, 1, n}];solv = MatrixForm[Transpose[{eta[[0]]}]];Do[solv = solv + MatrixForm[Transpose[{eta[[i]]}]]*Ck[[i]], {i, 1,n - r}];Print["X=", solv];)SolutionEquation[A_, B_] := (n = Length[A[[1]]]; m = Length[B];X = Table[varlist[[i]], {i, 1, n}]; AX = Dot[A, X];Print["求解下列线性方程组:"];Do[Print[AX[[i]], "=", B[[i]]], {i, 1, m}];Print["解:先对增广矩阵进行初等行变换:"];AUB = Transpose[Append[Transpose[A], B]];Print[MatrixPrint[Simplify[AUB]]];r = 1; fuq = {};(*fuq 存放自由未知量的下标*)Do[k = Infinity; flag = 0;(*查找列主元素的位置*)Do[If[AUB[[i, j]] != 0, flag = 1], {i, r, m}];If[flag == 0, fuq = Append[fuq, j]; Continue,Do[If[Abs[AUB[[i, j]]] < k && AUB[[i, j]] != 0, k = AUB[[i, j]]; t = i], {i, r, m}];If[t != r, TempMatrix = AUB[[t]];AUB[[t]] = AUB[[r]]; AUB[[r]] = TempMatrix];AUB[[r]] = AUB[[r]]/AUB[[r, j]];Do[AUB[[i]] = AUB[[i]] - AUB[[r]]*AUB[[i, j]], {i, 1, r - 1}];Do[AUB[[i]] = AUB[[i]] - AUB[[r]]*AUB[[i, j]], {i, r + 1, m}];Print["-->", MatrixPrint[Simplify[AUB]]];r = r + 1];, {j, 1, n}];r = r - 1;S = n - r;(*基础解系中解的个数*)Print[" 增广矩阵的秩r=", r, ", 未知量个数 n=", n, ";"];If[r == n, Print["结论:因为增广矩阵的秩等于未知量个数,方程组有唯一解:X=", dele = Table[{i}, {i, n + 1, m}];MatrixForm[Transpose[{Delete[Transpose[Simplify[AUB]][[n + 1]], dele]}]]], If[r == m, Print["结论:因为增广矩阵的秩等于方程个数且小于未知量个数,方程组有无穷多组解:"];PrintSolve[],If[AUB[[r + 1, n + 1]] != 0, Print["因为增广矩阵的秩小于未知量个数,但 dr+1!= 0,所给方程组无解"], Print["因为增广矩阵的秩小于未知量个数, 且dr+1=0,方程组有无穷多组解:"];PrintSolve[];];];];)说明:本程序可用于变量在25个内的任何线性方程组的求解,如果变量超过25个,只需要增加程序中conslist 与varlist 分量个数即可.例17:求解方程组⎪⎪⎩⎪⎪⎨⎧=-+-+=+-+-=+-+-=+-+-2342310634852232533354321543215432154321x x x x x x x x x x x x x x x x x x x x 在Mathematica 输入并运行:A={{3,-3,1,-1,1},{1,-5,2,-3,2},{5,-8,4,-3,6},{1,3,-2,4,-3}};b={3,2,10,2};SolutionEquation[A,b]即得到如下求解结果,其中所有内容全部由程序自动输出得到. 求解下列线性方程组: 3x1-3x2+x3-x4+x5=3 x1-5x2+2x3-3x4+2x5=2 5x1-8x2+4x3-3x4+6x5=10 x1+3x2−2x3+4x4−3x5=2例18:求解方程组⎪⎪⎩⎪⎪⎨⎧-=+-++=-++--=+-++=+-++1423412231245354321543215432154321x x x x x x x x x x x x x x x x x x x x 在Mathematica 输入并运行:A={{1,3,5,-4,2},{1,3,2,-2,1},{1,-4,1,1,-1},{1,2,1,-4,1}};b={1,-1,3,-1}; SolutionEquation[A,b]即得到如下求解结果,其中所有内容全部由程序自动输出得到.例19:求解线性方程组⎪⎪⎩⎪⎪⎨⎧-=+-=++=--=-+332523233231321321321x x x x x x x x x x x a1={1,2,-1};a2={1,-3,-1};a3={3,1,2};a4={-2,0,3};A={a1,a2,a3,a4};B={3,2,5,-3}; SolutionEquation[A,B]参考文献[1] 北京大学数学系几何与代数教研室前代数小组编.高等代数[M].北京:高等教育出版社,2003[2] 王绍恒,王艺静.利用Mathematica软件实现解线性方程组的可读性计算[J].重庆三峡学院学报,2009(3),25(3):143-146[3] 姜友谊,应宏,王绍恒.化实对称矩阵为对角矩阵的计算机算法[J].西南民族学院学报,2002,28(4):428-432[4] 张禾瑞,郝鈵新,高等代数(第五版)[M].北京:高等教育出版社,2007[5] 刘水强,王绍恒.利用初等行变换解线性矩阵方程[J].重庆三峡学院学报,2001,17(5):87-89[6] 徐士良.计算机常用算法[M].北京:清华大学出版社,2000.8.[7] 徐安农,科学计算引论:基于Mathematica的数值分析[M].北京:机械工业出版社,2010.8[8] 冯天祥,数值计算方法理论与实践研究[M].成都:西南交通大学出版社,2005[9] 阳明盛,林建华.Mathematica基础及数学软件[M],大连:大连理工大学出版社,2003[10][美] Rchard J. Gaylord,Samuel N.Kamin ,Paul R. Wellin著,耿勇译.数学软件Mathematica 入门[M].高等教育出版社,2001[11][美]D.尤金.Mathematica使用指南[M].邓建松,彭冉冉,译.北京:科学出版社,2002.。

mathematica 解方程

mathematica 解方程

mathematica 解方程Mathematica是一款强大的数学计算软件,它不仅可以进行数学计算,还可以进行数据分析、图像处理等多种功能。

其中,解方程是Mathematica的一个重要功能,本文将介绍Mathematica解方程的基本原理和应用。

一、Mathematica解方程的基本原理Mathematica解方程的基本原理是通过求解方程的根来得到方程的解。

Mathematica可以解决各种类型的方程,包括代数方程、微分方程、偏微分方程等。

在解方程时,Mathematica会自动选择最适合的求解方法,并给出方程的解析解或数值解。

Mathematica解方程的核心功能是Solve、NSolve和DSolve。

其中,Solve和NSolve用于解决代数方程,DSolve用于解决微分方程和偏微分方程。

Solve和NSolve的使用方法类似,它们都是用于解决代数方程的。

Solve可以求解精确解,而NSolve可以求解数值解。

例如,我们要解决方程x^2-3x+2=0,可以使用Solve和NSolve命令:Solve[x^2-3x+2==0,x]NSolve[x^2-3x+2==0,x]执行上述代码后,Mathematica会输出方程的解析解或数值解。

DSolve用于解决微分方程和偏微分方程。

例如,我们要解决微分方程y''+y=0,可以使用DSolve命令:DSolve[y''+y==0,y,x]执行上述代码后,Mathematica会输出微分方程的通解。

二、Mathematica解方程的应用Mathematica解方程的应用非常广泛,主要包括以下几个方面。

1.求解代数方程Mathematica可以求解各种类型的代数方程,包括一元多项式方程、多元多项式方程、代数方程组等。

例如,我们要解决方程组x+y=3,x-y=1,可以使用Solve命令:Solve[{x+y==3,x-y==1},{x,y}]执行上述代码后,Mathematica会输出方程组的解析解。

(完整版)Mathematica求解方程(组)、级数

(完整版)Mathematica求解方程(组)、级数

(完整版)Mathematica求解方程(组)、级数方程(组)与级数的Mathematica 求解[学习目标]1. 能用Mathematica 求各种方程(组)的数值解和近似解;2. 能对常见函数进行幂级数的展开。

一、求解简单方程(组)数学里的方程是带有变量的等式。

一般地说,一个或一组方程总是对于方程中出现的变量的可能取值范围增加了一些限制。

所谓求解方程就是设法把方程对于变量取值的限制弄清楚,最好的结果是用不含变量的表达式把变量的值表示出来。

在这个系统里,方程也用含有变量的等式表示,要注意的是在这里等号用连续的两个等号(==)表示。

方程的两端可以是任何数学表达式。

用户可以自己操作Mathematica 系统去求解方程,例如使用移项一类的等价变换规则对方程加以变形、对方程的两端进行整理、把函数作用于方程的两端等等。

系统也提供了一些用于求解方程的函数。

1、求方程的代数解最基本的方程求解函数是Solve ,它可以用于求解方程(主要是多项式方程)或方程组。

Solve 有两个参数,第一个参数是一个方程,或者是由若干个方程组的表(表示一个方程组);第二个参数是要求解的变量或变量表。

例如,下面的式子对于变量X 求解方程016x x x 234=+--:In[1]:=Solve[x^4-x^3-6x^2+1==0,x]输入了这个表达式,系统立刻就能计算出方程的四个根,求出的解都是精确解(代数根)。

对于一般的多项式,这样得出的解常常是用根式描述的复数。

方程的解被表示成一个表,表中是几个子表,每一个子表的形式都是{x->...},箭头后面是方程的一个解。

Solve 也可以求解多变量的方程或者方程组:In[2]:=Solve[{x-2y==0,x^2-y==1},{x,y}]这个表达式求解方程组: x y x y -=-=2012.有时求解方程会得到非常复杂的解。

例如将上面的第一个方程稍加变形,所得到的解的表达式就会变得很长:In[3]:=Solve[x^4-x^3-6x^2=2==0,x]这个表达式求出的解的表达式非常长,以至一个计算机屏幕显示不下。

用软件Mathematica 求解线性代数

用软件Mathematica 求解线性代数
注意:只有方阵才可以求其逆矩阵,所以这里的矩阵A 必须是方阵, 注意:只有方阵才可以求其逆矩阵,所以这里的矩阵 必须是方阵, 并且为了使该矩阵可逆,还须保证该矩阵的行列式不为零。 并且为了使该矩阵可逆,还须保证该矩阵的行列式不为零。
求解逆矩阵的办法: ) 求解逆矩阵的办法:1)利用伴随矩阵
1 * A = A A
例:设
3 2 0 5 0 3 −2 3 6 −1 A= 2 0 1 5 −3 1 6 −4 −1 4
化简A为行最简形矩阵并求秩。 化简A为行最简形矩阵并求秩。 LOGO
以矩阵形式显示 行最简型矩阵
有三个非零行,秩为3 有三个非零行,秩为3
求矩阵的秩
YOUR SITE HERE
MatrixPower[A,n] 求矩阵A的n次幂 求矩阵A LinearSolve[A,b] 求线性方程组的解
YOUR SITE HERE
学习资料: 学习资料:
学习网站 中文电子书索取地址 lg8124@ 书籍
LOGO
YOUR SITE HERE
向量的相关运算 求解线性方程thematica 的功能
LOGO
• 数值与符号运算
-
能够快速准确的进行所有的数学运算
• 绘图功能强大
创建任何函数的二维及三维图像 - 创建任何函数的二维及三维图像
• 编制程序;处理声音、图像;系统模拟仿真 编制程序;处理声音、图像; 等
分号表示,系统执 分号表示, 行计算, 行计算,但不再显 示计算结果。 示计算结果。
LOGO
矩阵 格式
软件按列表数据 软件按列表数据计算 列表数据计算 ,反馈给用户也是列 表数据。 表数据。
YOUR SITE HERE

利用Mathematica求解线性系统

利用Mathematica求解线性系统
表1
函数名称 LinearS olve[ m, b] N ullS pace[ m] RowR educe[ m]
求解线性系统的函数
作 用
求矩阵方程 m x = b 的解 求矩阵方程 m x = 0 的解 通过矩阵的初等变换 , 得到矩阵 m 的简化形式
我们下面首先定义一个矩阵 m , 利用它生成一个方程组, 然后使用 Mathem at ica 中的函数 Solve 求解该方程组 , 程序及其输出结果如下 : I n[ 1 ] : = m = { { 1, 5 } , { 2 , 1} } ; m . { x , y } = { a, b} ;
第4期
李汝修等: 利用 M at hemat ica 求解线性系统 1 1 2 - 3 1 - 1 1 4 , b= 5 - 2 - 2 ,D= | A| .
71
解法 1
利用克莱姆法则, A =
1 2
- 1 - 5
3 1 2 11 0 D1 D2 D3 D4 x 1= D , x 2= D , x 3= D , x 4= D . I n[ 1 ] : = A = { { 1, 1, 1, 1} , { 1, 2, - 1, 4} , { 2, - 3, - 1, - 5} , { 3, 1 , 2, 11} } ; b = { 5 , - 2 , - 2 , 0} ; A 0 = T ranspose [ A ] ; A 1 = ReplacePart[ A 0, b , 1] ; A 2 = ReplacePart[ A 0, b , 2] ; A 3 = ReplacePart[ A 0, b , 3] ; A 4 = ReplacePart[ A 0, b , 4] ; X = { Det [ A 1 ] / Det [ A ] , Det [ A 2 ] / Det [ A ] , Det [ A 3 ] / Det [ A ] , Det [ A 4 ] / Det [ A ] } out [ 1] = { 1 , 2, 3 , - 1} 其中, A 是方程组的系数矩阵 , b 是方程右端的常数项组成的向量 , A 0 是 A 的转置矩阵 , A 1、 A 2、 A 3、 A 4 分别是矩阵 A 0 中第 i 行用 b 代替后所得到的矩阵 ( 即 A 中的第 i 列用 b 的 转置代替后所得到的矩阵的转置) , x 是解向量. - 1 解法 2 利用逆矩阵. D = | A | 0, x = A b . I n[ 2 ] : = Inverse [ A ] . b out [ 2] = { 1 , 2, 3 , - 1} 其中 , Inverse [ A ] 是矩阵 A 的逆. 解法 3 利用函数 Solve . I n[ 3 ] : = Solve [ { x 1 + x 2 + x 3 + x 4 = 5, x 1 + 2 x 2 - x 3 + 4 x 4 = - 2 , 2 x 1 - 3 x 2 - x 3 - 5 x 4 = - 2, 3 x 1 + x 2 + 2 x 3 + 11 x 4 = 0} , { x 1 , x 2 , x 3 , x 4 } ] out [ 3] = { { x 1 1 , x 2 2, x 3 3 , x 4 - 1} } 值得注意的是在 M at hemat ica 系统中方程组的表示方法, 实际上方程组被表示成了一个 由方程构成的表 , 方程中的等号用双等号表示, 上例中方程组的变量用 x 1、 x 2、 x 3、 x 4 来表 示, 它们是由字母开头的字母、 数字组成的符号串 , 它们是一个整体. 解法 4 利用 L U 分解 . 首先对矩阵 1 1 1 1 1 2 - 1 4 A= 2 - 3 - 1 - 5 3 1 2 11 进行 L U 分解 , 再利用函数 LU BackSubst itut ion 就可得到方程的解: A x= b I n[ 4 ] : = A = { { 1, 1, 1, 1} , { 1, 2, - 1, 4} , { 2, - 3, - 1, - 5} , { 3, 1 , 2, 11} } ; b = { 5, - 2, - 2, 0} ; s = L UDecomposit ion [ A ] ;

Mathematica实验六 线性方程组

Mathematica实验六  线性方程组



Transpose[A]:求矩阵A的转置阵 Map[f,expr]映射将f分别作用到expr第一层的每一 个元上得到的列表 Map[f,{a,b,c,d,e}] {f[a],f[b],f[c],f[d],f[e]} Point[{coords1,coords2,}] represents a collection of points. Graphics[Point[Table[{t,Sin[t]},{t,0,2p,2p/10}]]] violet?
实验六 线性方程组

练习3 给定数据点(3.3,1.2),(2.0,3.1),(-3.0,2.6),(0.8,0.2),(1.4,-1.0),(3.0,0.7).试用最小二乘法做出一个 圆来拟合这些数据

最小二乘问题的法方程

对于最小二乘问题矩阵是m×n且m>n
X y

但这个系统是超定的,若方程组是矛盾的,则精确 求解是不可能的。所以要转化为最小二乘问题
min X y

最小二乘问题的法方程
作为极小值问题,最小二乘问题可以用类似单变量 微积分中导数为0的方法来处理 目标:残差向量r=b-Ax的欧几里得范数的平方取 最小值。
实验六 线性方程组
练习1 求解线性方程 2 4 X 0 ,并画出 (1,2) 3 6 与X的图形。 观察图形并给出你的结论

实验六 线性方程组
实验2 求出通过平面上三点(0,7),(1,6)和(2,9)的二次 多项式ax2+bx+c,并画出其图形 根据条件有 0*a+0*b+c=7 1*a+1*b+c=6 4*a+2*b)= ax4+bx3+cx2+dx+e,则有 e=0 a+b+c+d+e=1 a-b+c-d+e=3 -4a+3b-2c+d=20 4a+3b+2c+d=9

mathematica 行向量 列向量 矩阵

mathematica 行向量 列向量 矩阵

mathematica 行向量列向量矩阵Mathematica是一款强大的数学软件,广泛应用于科学计算、数据分析等领域。

本文将重点介绍Mathematica中的行向量、列向量以及矩阵的相关概念和操作。

一、Mathematica基础概念介绍Mathematica中的向量和矩阵是线性代数的基本概念。

向量是具有相同类型的元素的序列,可以表示为一个列表。

矩阵是具有相同类型的元素的二维数组。

在Mathematica中,行向量和列向量分别表示为一维列表和二维列表。

二、行向量与列向量的定义及应用1.行向量:行向量是一个长度为n的列向量,其中n表示向量中元素的个数。

在Mathematica中,用方括号[]表示行向量,如下所示:```{a1, a2, a3, ..., an}```2.列向量:列向量是一个长度为n的行向量,其中n表示向量中元素的个数。

在Mathematica中,用圆括号()表示列向量,如下所示:```(a1, a2, a3, ..., an)```3.应用:行向量和列向量在Mathematica中有很多应用,如线性方程组求解、矩阵运算等。

三、矩阵的创建与操作1.创建矩阵:在Mathematica中,可以使用以下方法创建矩阵:```Matrix[{a1, a2, a3}, {b1, b2, b3}]```其中,{a1, a2, a3}和{b1, b2, b3}分别表示矩阵的行向量和列向量。

2.矩阵操作:矩阵在Mathematica中可以进行加法、减法、乘法等基本操作。

以下为一个例子:```Matrix[{1, 2, 3}, {4, 5, 6}] + Matrix[{7, 8, 9}, {10, 11, 12}]```3.矩阵转置:使用Transpose函数可以实现矩阵的转置,如下所示:```Transpose[Matrix[{1, 2, 3}, {4, 5, 6}]```四、实例演示与实践以下为一个简单的实例,演示如何使用Mathematica解决线性方程组问题:```方程组:a * x +b * y = 1c * x +d * y = 2已知系数矩阵:{a, b, c}{d, e, f}求解得到的解为:{x, y}```使用Mathematica求解:```eqns = {a * x + b * y == 1, c * x + d * y == 2};coefficients = {a, b, c, d, e, f};sol = Solve[eqns, x, y];```通过以上实例,我们可以看出Mathematica在处理线性方程组问题方面的强大功能。

应用Mathematica软件促进线性代数和矩阵论教学改革

应用Mathematica软件促进线性代数和矩阵论教学改革

应用Mathematica软件促进线性代数和矩阵论教学改革【摘要】本文从矩阵论课程目前存在的问题出发,通过分析现有问题,提出线性代数课程中一些教学方法的改革,并提出合理使用mathematica数学软件促进两门课程的教学。

【关键词】教学改革矩阵论线性代数 mathematica软件【中图分类号】g42 【文献标识码】a 【文章编号】2095-3089(2013)03-0120-01矩阵在现代数学中可以认为是非常重要的工具,矩阵理论在计算科学、控制理论、信息科学与技术、管理科学等问题中都发挥着举足轻重的作用。

线性代数和矩阵论是研究矩阵理论的两门课程,其中,线性代数是为理工科本科学生开设的一门公共基础必修课,主要讲授行列式、矩阵、线性方程组、线性空间、二次型等内容;矩阵论是为工科研究生开设的一门公共学位课,主要讲授线性空间与线性变换、相似标准形、矩阵分解、矩阵分析、矩阵函数等内容。

矩阵论起初是线性代数的一个分支,但其后由于陆续在图论、代数、组合数学和统计上得到应用,逐渐发展成为一门独立的学科。

一、课程教学中出现的问题矩阵论是一门理论严谨、内容抽象的课程,在矩阵论课程教学中,从线性代数中设计到的基础知识出发,增加了很多新的内容,而且,很多理论从实数域推广到了复数域。

在授课中,我们发现在一些涉及到线性代数的基础知识的理解和计算中还存在着一些问题,影响了学生掌握新的知识。

(1)线性空间内容的理解线性空间是具有加法和数量乘法两个线性运算的非空集合,线性空间也叫向量空间,线性空间中的元素都称为向量。

学生对数组向量空间的相关内容基本理解,对其他类型的线性空间理解不好。

(2)矩阵正交三角分解的理解在矩阵正交三角分解这部分内容中,一个实数域上的满秩方阵可以分解为正交矩阵与正线上三角矩阵的乘积,在分解过程中需要把线性无关向量组进行施密特正交化,单位化,学生在正交化过程中出错较多。

(3)内积空间中向量长度的理解在定义了内积运算的线性空间中,向量的长度的平方定义为向量与自身的内积,学生对特定空间的内积概念与作用理解不好,经常将数组向量空间中的计算用到一般的内积空间中,导致在后面使用长度的计算中经常使用的是欧氏空间中向量的内积的计算公式。

mathematica 数组 解方程

mathematica 数组 解方程

mathematica 数组解方程数学是一门充满魅力的学科,它在现代科学和工程中起着重要的作用。

在数学中,解方程是一项基本的技能。

在本文中,我们将使用Mathematica数组来解决一个关于线性方程组的问题。

假设我们有一个包含未知数的线性方程组,如下所示:2x + 3y + z = 104x - y + 2z = 5x + 2y - 3z = 3我们可以使用Mathematica数组来解决这个方程组。

首先,我们将方程组的系数和常数项定义为数组。

让我们将系数和常数项存储在名为"coefficients"和"constants"的数组中。

coefficients = {{2, 3, 1}, {4, -1, 2}, {1, 2, -3}}; constants = {10, 5, 3};接下来,我们可以使用Mathematica的线性方程组求解函数来求解这个方程组。

让我们将解存储在名为"solutions"的数组中。

solutions = LinearSolve[coefficients, constants];我们可以输出解。

Print["解为:"];Print["x = ", solutions[[1]]];Print["y = ", solutions[[2]]];Print["z = ", solutions[[3]]];通过运行上述代码,我们可以得到方程组的解。

这种方法不仅简单,而且非常高效。

使用Mathematica数组解方程可以帮助我们更好地理解和解决数学问题。

总结起来,本文介绍了如何使用Mathematica数组解决线性方程组的问题。

我们使用了Mathematica的线性方程组求解函数来求解方程组,并通过输出结果展示了解的值。

这种方法可以帮助我们更好地理解和解决数学问题。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

利用Mathematica 软件实现线性方程组求解摘要:Mathematica 作为一款独特的数学软件,有强大的数值计算和符号计算能力,具有很强的实用性,而线性方程组在线性代数中具有重要的地位.针对线性方程组的解具有零解、唯一解、无穷解的情况,文章借助Mathematica 数学软件分别给出求解的算法以及如何直接调用内部函数求解线性方程组的方法.文章中主要利用高斯-约当(Gauss-Jordan )消元法、矩阵的LU 分解法求解线性方程组,并用Mathematica 软件对这两种算法予以实现.同时给出了带有可读性好的求解过程、能用于各种逆矩阵和线性方程组求解的通用程序,利用Mathematica 数学软件实现对求逆矩阵和线性方程组的可读性计算.关键字:Mathematica ;线性方程组;可读性计算;算法引言1.Mathematica 软件功能简介Mathematica 作为一款独特的数学软件,有强大的数值计算和符号计算能力.同时,线性方程组是连接矩阵和向量组的纽带,也是矩阵和向量组的直接应用.在我们的实际工作中出现的大量数学模型,他们最后都可以化为解线性方程组,所以对线性方程组的解的研究是非常重要的.在数学的许多分支中都涉及到线性方程组的问题,我们通常分齐次与非齐次两大类以及未知量个数与方程个数相等或不等对其进行求解,在系数矩阵为方阵时,还可以按照行列式是否为零进行分类.对于线性方程组的求解,其算法是非常清楚的,就是利用矩阵的行初等变换将对应的增广矩阵化为行最简矩阵,然后就可写出通解.但是由于整个过程涉及到大量数字运算,往往会因计算过程中不小心出现一些计算错误而导致错误的结论,有时甚至出现对没解的方程求出有解,或相反.然而,如果利用数学软件Mathematica ,可以将大家从繁琐的数字运算中解脱出来,而将注意力集中在基本概念和基本算法的学习上,从而增加学习兴趣,提高学习效率.笔者从事了一年多大学生创新实验《基于数学软件的高等代数解题实践研究》,通过实践发现,如果能够通过计算机编程让计算机自动求解各种线性方程组,这将是非常快速、方便的.因此本文以Mathematica 数学软件为平台,通过举例、演示与实验来理解线性方程组中的一些抽象概念和理论,并简捷直观地用计算机来解决复杂的线性方程组的求解问题,化简过难、过繁的运算技巧.本文根据Mathematica 软件强大的数值计算无误差的特点和符号计算功能,总结Mathematica 的关于线性方程组计算的功能、命令,总结了求解线性方程组的解的算法,并给出带有可读性好的求解过程、能用于各种线性方程组求解的通用程序,实现线性方程组的可读性计算.由于本章用到线性代数的许多基本知识,有必要对相关的概念和性质做一下说明. 定义1 如两个方程组具有完全相同的解,则称两个方程组为等价方程组.定义2 关于方程组的初等运算有三种类型:1) 交换方程组中两个方程:i j R R ↔,称为交换运算.2) 用一个非零的实数乘以某一方程:i i R R λ→,称为倍法运算.3) 某方程加上另一个方程的倍数:i j i R R R λ+→,称为消法运算.定理1 若一个方程由另一个方程经过有限次初等运算得到的,则这两个方程组等价.定义3 矩阵的初等变换,用i A 表示矩阵A 的第i 行,那么有:1) 交换A 的两行:i j A A ↔,称为交换变换.2) 用一个非零的实数λ乘以A 的某一行:i j A A λ→,称为倍法变换.3) 用A 某行加上另一行的λ倍:i j i A A A λ+→,称为消法表换.定义4 对矩阵A 施行初等变换,得到的矩阵称为相应的初等阵.例如23100100010001001010A A ↔⎛⎫⎛⎫ ⎪ ⎪−−−→ ⎪ ⎪ ⎪ ⎪⎝⎭⎝⎭记作23E2210010001000001001A A λλ⨯↔⎛⎫⎛⎫ ⎪ ⎪−−−−→ ⎪ ⎪ ⎪ ⎪⎝⎭⎝⎭记作()2E λ32310010001001000101A A A λλ+⨯↔⎛⎫⎛⎫ ⎪ ⎪−−−−−→ ⎪ ⎪ ⎪ ⎪⎝⎭⎝⎭记作()23E λ定理2 对矩阵施行初等变换相当于将矩阵左乘相应的初等阵.212+-210210221-101-5001001A A A ⨯→⎛⎫⎛⎫ ⎪ ⎪−−−−−−→ ⎪ ⎪ ⎪ ⎪⎝⎭⎝⎭()相当于12(-2)E A100102102-21021-1=01-5001001001⎛⎫⎛⎫⎛⎫ ⎪⎪ ⎪ ⎪⎪ ⎪ ⎪⎪ ⎪⎝⎭⎝⎭⎝⎭定理3 对任何n 阶矩阵A,以下性质等价:1) A 存在逆矩阵,即A 是可逆矩阵.2) 0A ≠,即A 是非奇异矩阵.3) A 的行向量组(列向量组)线性无关.4) 方程组AX b =有唯一解.定理4 如果矩阵A 经过一系列的初等变换化为单位阵E,则单位阵E 通过相同的初等变换化为1A -.由此得出用初等变换求矩阵逆的方法下例所示. 例1:求矩阵123133247A ⎛⎫ ⎪= ⎪ ⎪⎝⎭的逆. 解:()(2)(1)(1)(2)(3)(1)13(3)(2)13(1)(3)(3)(1)(1)(2)211231*********33010010-110247001011-201123100100010-110010001-1-110A E +-⨯→+-⨯→+-⨯→+-⨯→+-⨯→⎛⎫⎛⎫ ⎪ ⎪=−−−−−−→−−−−−−→ ⎪ ⎪ ⎪ ⎪⎝⎭⎝⎭⎛⎫ ⎪−−−−−−→ ⎪ ⎪⎝⎭()()()()()()()-161-3-110=01-1-11E A ⎛⎫ ⎪ ⎪ ⎪⎝⎭ 2 Mathematica 软件常用命令及其功能为了便于读者更好地利用Mathematica 软件解决数学问题,首先给出本文程序涉及的Mathematica 数学软件的命令及其功能.Append[expr,elem]——生成一个在表expr 的最后添加元素elem 后的表;Complement[listall, list1,list2,…]——求全集listall 对listi 的差集; Delete[expr,{i}]——删除expr 中第i 个元素后剩下的表;Do[expr,{imax}]——重复执行expr 共imax 次;Table[expr,{imax}]-—生成一个由表达式expr 产生的元素构成的共imax 个元素的表; Do[expr,{i,min,max}]——循环变量i 按步长1从min 取至max,重复执行表达式expr; Do[expr,{i,imin,imax},{j,jmin,jmax},…]——多重循环;Dot[a,b]——矩阵、向量、张量a 与b 的内积;Transpose[list]——对矩阵list 进行转置; IdentityMatrix[n]——自动生成一个n 阶单位矩阵;Insert[expr,elem,n]——在表expr 的第n 个元素前插入元素elem 产生一个新表; If[condition,t,f]——如果条件condition 为True,执行t 段,否则执行f 段;Length[expr]——表expr 中第一层元素的个数( 通常称为表的长度);LinearSolve[A,b],给出向量x,使得Ax b =成立.——求解线性方程组Ax b =的一个特解; LUBackSubstitution[数据,b]——利用LUDecomposition[矩阵A]输出的结果求解方程组矩阵.x=bLUDecomposition[A]——求出矩阵A 的LU 分解;LUMatrices[lu]——返回一个形式为{l,u}的列表;MatrixForm[expr]——按矩阵形式将表expr 输出;NullSpace[A]——求齐次线性方程组AX=0的基础解系;Print[expr1,expr2,…]——顺次输出表达式expri 的值;RowReduce[A]——将矩阵A 化为简化行梯形形式;Simplify[expr]——对表达式expr 进行化简;Solve[eqns,vars]——从方程组eqns 中解出变量vars;(*information*)--注释语句,其中information 表示对程序作说明;{a,b,c}--Mathematica 中表的结构,表示元素分别为a,b,c 的表;3线性方程组解的算法及在Mathematica 软件中的实现3.1线性方程组的解考虑线性方程组:,,,()n m m n A X b X R b R R A m ⨯=∈∈= (1)其对应的齐次线性方程组为:0AX = (2)讨论线性方程组AX b =的求解问题,式中A 为m n ⨯阶系数矩阵,b 为1m ⨯阶右端列向量,X 为待求的1n ⨯阶列向量.这里首先假定m n ≤,如果m n >留待稍后讨论.当m n =且行列式0A ≠时,称AX b =为恰定方程组;当m n <时,称AX b =为不定方程组;当m n >时,称AX b =为超定方程组;在上述方程组求解的讨论中,常常要用到系数矩阵A 的秩()R A ,与增广矩阵的秩(,)R A b ,有时还要计算对应齐次方程组0AX =的基础解系.线性方程组(1)的解有以下3个结论:线性方程组的解的基本问题:当()(,)R A R A b n ==时,(1)有唯一解;当()(,)R A R A b n =<时,(1)有无穷多组解;当()(,)R A R A b <时,(1)无解.线性方程组的解的结构问题:线性方程组(1)对应的齐次方程组(2)的基础解系由()n R A -个向量组成;(2)的通解为基础解系的任意线性组合;(1)的通解为(1)的特解与(2)的通解之和.Mathematica 软件中的命令Solve 可以直接求出方程组(不限于线性)的解,一般格式为:Solve[eqns,vars],其功能是从方程组eqns 中解出变量vars.(但对于大的方程组而言,这种方法就显得有点儿麻烦,而且效率不高.)也有专门用于求解线性方程组的命令,一般格式为:LinearSolve[A,b],给出向量x,使得AX b =成立.其功能是求解线性方程组AX b =的一个特解,此命令的缺陷是当方程组的解不唯一时,只能求出一个特解而不能求通解.其中A 是方程组的系数矩阵,而b 为线性方程组的“右边项”.如果A 为可逆阵,那么LinearSolve 就给出线性方程组的唯一解.如果A 为奇异阵,那么方程组就可能没有解,也有可能存在无穷组解.如果方程组具有唯一解,Mathematica 就会给出这个解(如例3).如果方程组没有解,Mathematica 就会返回出错信息(*Linear equation encountered which has no solution.*),即遇到了没有解的线性方程组.(如例4)例2:求解线性方程组.⎪⎩⎪⎨⎧=++=++=++147338523532321321321x x x x x x x x xA1={{2,1,3},{3,2,5},{3,3,7}};b1={5,8,14};Det[A1]=10≠,故知方程组有唯一解LinearSolve[A1,b1] (*利用Solve 函数求解11A X b =*)={-3,-4,5} (*求得解543321=-=-=x x x *)例3:求解线性方程组⎪⎩⎪⎨⎧=++=+-=++124313427233z y x z y x z y x⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡-=12171;4313422331b a a1={{3,3,2},{2,-4,3},{1,3,4}};b1={{7},{1},{12}};运行LinearSolve[a1,b1]得:231776,,701435⎧⎫⎧⎫⎧⎫⎧⎫-⎨⎨⎬⎨⎬⎨⎬⎬⎩⎭⎩⎭⎩⎭⎩⎭例4:方程组⎪⎩⎪⎨⎧=+-=+-=++1143313462z y x z y x z y x 没有解.⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡--=11162;4333411122b a a2={{2,1,1},{1,-4,3},{3,-3,4}};b2={{6},{1},{11}};运行LinearSolve[a2,b2]得:LinearSolve::nosol: Linear equation encountered that has no solution.(遇到了没有解的线性方程组)LinearSolve[{{2,1,1},{1,−4,3},{3,−3,4}},{{6},{1},{11}}]如果方程组没有解,Mathematica 就会返回出错信息(*Linear equation encountered which has no solution.*),即这是一个没有解的线性方程组.如果方程组Ax=b 有无穷组解,问题就有一些复杂了.对于这种情况,Mathematica 就会返回一个解,我们称其为特解.而所有解是由特解加上对应的齐次方程组Ax=0的所有解构成的.所有满足0AX =的向量X 全体称为A 的零空间,可以很容易地用NullSpace 命令确定出零空间的构造.NullSpace[A ]返回A 的零空间的基向量,即齐次线性方程组AX=0的基础解系.A 的零度,即A 的零空间中最大线性无关向量组的向量个数,可以通过运行Length[NullSpace[a]]得到. A的秩可以用n-Length[NullSpace[A]]算出,其中n表示A 的列数.例5:方程组2y74323349x zx y zx y z++=⎧⎪-+=⎨⎪-+=⎩有无穷组解.a={{2,1,1},{1,-4,3},{3,-3,4}};b={{7},{2},{9}};nullspacebasis=NullSpace[a]{{−7,5,9}}(*由于零向量非空,因此没有唯一解*)particular = LinearSolve[a, b]{{10/3}, {1/3}, {0}}(*这是一个特解*)方程组的完全解具有形式t*nullspacebasis+particular,其中t是任意参数.然而,为了表示成单个列表,我们必须展平nullspacebasis和particular. generalsolution = t*Flatten[nullspacebasis] + Flatten[particular]{10/3 - 7 t, 1/3 + 5 t, 9 t}作为检验的步骤,我们下面把一般解代回到原来的方程组中.a.x /. x -> {10/3 - 7 t, 1/3 + 5 t, 9 t} // Expand{7,2,9}关于线性方程组求解的算法研究已比较成熟,本文主要利用高斯-约当(Gauss-Jordan)消元法和矩阵LU分解法求解线性方程组.3.2高斯-约当(Gauss-Jordan)消元法求解线性方程组ax=b的高斯-约当方法是基于对增广矩阵[]a b的简化处理,这个过程通过初等变换把矩阵转化为简化行阶梯形的形式.基本初等行变换有下述三种:①交换两行②在一行中乘上一个非零常数③在一行中加上另一行的倍数.容易证明初等行变换对方程组的解没有影响.一个矩阵称为简化行阶梯形形式,是指①每一行中第一个非零元素都是1(称为首1)②在这个1的上面或者下面的元素都是0③对于两个首1的行,下面的行中第一个非零元素比前一个更靠右.在求解线性方程组时,我们首先应该使用初等行变换把增广矩阵转化为简化梯形形式.学过线性代数或者高等代数的读者都知道初等行变换是非常麻烦的,很容易出错.并且只要有一个地方出错,后面的计算就已经无用了.然而,Mathematica数学软件中的RowReduce命令可以自动把任意矩阵转化为简化行梯形形式.RowReduce[A]——把矩阵A 转化为简化行梯形形式.例6: 考虑3⨯4阶矩阵,其元素为ij a i j =-.a=Table[Abs[i-j],{i,1,3},{j,1,4}];a//MatrixForm⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡123012101210 RowReduce[a] //MatrixForm⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡23021100010001 下面我们演示行简化过程是怎么用于线性方程组的求解.为了便于比较,我们使用的范例采用前面的例3、例4与例5 中考虑的三个例子.例7:(a )方程组124313427233=++=+-=++z y x z y x z y x (有唯一解) (b )方程组1143313462=+-=+-=++z y x z y x z y x (无解) (c )方程组943323472=+-=+-=++z y x z y x z y x (有无穷组解)这三个方程组的增广矩阵分别为 ⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡--=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡--=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡-=9433234171123;11433134161122;12431134272331a a aa1={{3,3,2,7},{2,-4,3,1},{1,3,4,12}};a2={{2,1,1,6},{1,-4,3,1},{3,-3,4,11}};a3={{2,1,1,7},{1,-4,3,2},{3,-3,4,9}}; RowReduce[a1]//MatrixForm⎪⎪⎪⎪⎪⎪⎭⎫ ⎝⎛-357610014170107023001 (*当矩阵被简化后,如果把它看作方程组,容易看出x=-23/70,y=17/14,z=76/35*) RowReduce[a2] //MatrixForm795910001-00001⎛⎫ ⎪ ⎪ ⎪⎝⎭(*简化后的矩阵第三行指的是0001x y z ++=,这当然是不可能的.这个矛盾(一行中只有最后一个元素是非零,其余都是零)说明方程组没有解.*) RowReduce[a3] //MatrixForm7109351931001-0000⎛⎫ ⎪ ⎪ ⎪⎝⎭(底行全是0没有任何不对的地方,然而这个方程组没有唯一解,如果令z=t,其中t 为独立参数,那么方程组的解具有如下形式:10715,,3939x t y t z t =-=+=) [注释] 虽然这个解与例5给出的解在形式上稍有些不同,但从它们确定相同的解集的意义上看,它们是等价的.求解线性方程组的算法步骤为:1.对增广矩阵(非齐次)或系数矩阵(齐次)进行初等行变换,将其转化为行最简形矩阵(对非齐次线性方程组判断是否有解);2.确定非自由未知量和自由未知量,将行最简形“翻译”为方程组;3.令自由未知量等于任意常数,得到通解.3.3 矩阵的LU 分解法(Doolittle 法)LU 分解法(杜利特尔Doolittle 方法) 是另外一种经常使用的求解线性方程组的方法,尤其是当具有许多方程组,而且每个方程组的系数相同时,这种方法特别有用. LU 分解法的基本思想是这样的.如果A 为方阵,那么它可以分解为A=LU,其中L 为下三角矩阵,主对角线上元素全是1,U 为上三角矩阵.这样方程组Ax=b 就转化为(LU )x=b,其可重写为L (Ux )=b.如果令y=Ux,那么可以从Ly=b 中解出y,一旦有了y,就可以从Ux=y 中解出x.(LU)Ly b Ax b x b Ux y =⎧=⇔=⇔⎨=⎩虽然矩阵LU 分解法把一个方程组的求解转化为两个方程组的求解,但由于现在每个方程组的系数矩阵都是三角矩阵,因此计算起来速度是很快的.这样一来,如果使用LU 分解法求解线性方程组,就包含两个步骤:分解与回代.对应的Mathematica 命令就分别为LUDecomposition 与LUBackSubstitution .LUDecomposition[A]——求出矩阵A 的LU 分解;LUBackSubstitution[数据,b]——利用LUDecomposition[矩阵A]输出的结果求解方程组矩阵.x=bLUDecomposition 的输出为数据,由三部分组成:(1)矩阵L 与U 被压缩到一个矩阵中,(2)一个置换向量,以及(3)矩阵的L ∞条件数.把数据送给LUBackSubstitution 就可以求解出线1112111121421222212221212111n n n n n nn n n nn a a a r r r a a a l r r A a a a l l r ⎛⎫⎛⎫⎛⎫ ⎪ ⎪⎪ ⎪ ⎪⎪== ⎪ ⎪⎪ ⎪ ⎪⎪⎝⎭⎝⎭⎝⎭性方程组.置换向量对行进行重新安排,以保证矩阵具有最大的数值稳定性.本文不再对条件数加以讨论.LUDecomposition 与LUBackSubstitution 不能用于求解具有无穷组解的线性方程组.例8: 利用LU 分解法求解线性方程组2y 743232213x z x y z x y z ++=⎧⎪-+=⎨⎪++=⎩.为了用LU 分解法求解线性方程组,我们首先对系数矩阵进行矩阵分解.2117143;2;32213a b ⎡⎤⎡⎤⎢⎥⎢⎥=-=⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦运行Clear all;a={{2,1,1},{1,-4,3},{3,2,2}};b={{7},{2},{13}};data=LUDecomposition[a]得{{{1, -4, 3}, {2, 9, -5}, {3, 14/9, 7/9}}, {2, 1, 3}, 1}LUBackSubstitution[data,b]{{1},{2},{3}}在例9和例10中演示了LUDecomposition 返回数据的结构.例9 567131232728m ⎛⎫ ⎪= ⎪ ⎪⎝⎭;m={{5,6,7},{1,3,12},{3,27,28}};{lu,m,cond}=LUDecomposition[m]{{{1,3,12},{5,-9,-53},{3,-2,-114}},{2,1,3},1}在本例中,没有进行行置换,因为此时的置换向量p 就是{1,2,3}.LUDecomposition[m]的第一部分是以压缩形式给出的两个矩阵,因为我们已知LU 的形式为100100100x x x x x x x x x ⎡⎤⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦; 所以要想指定矩阵L 、U,只需要指定九个元素(用x 表示).在LUDecomposition[m]的第一部分就是用单个矩阵的形式给出这九个数.lu//MatrixForm234256347⎡⎤⎢⎥⎢⎥⎢⎥⎣⎦这些数虽然是组合在一个矩阵中,但每个数所在的位置却是分别与L 、U 中的位置一致的,因此100234LU 210056341007⎡⎤⎡⎤⎢⎥⎢⎥=⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦例10 211143322m ⎡⎤⎢⎥=-⎢⎥⎢⎥⎣⎦; Clear all;m={{2,1,1},{1,-4,3},{3,2,2}};{lu,p,cond}=LUDecomposition[m]{{{1, -4, 3}, {2, 9, -5}, {3, 14/9, 7/9}}, {2, 1, 3}, 1}lu//MatrixForm714991432953⎛⎫ ⎪ ⎪ ⎪⎝⎭--如果仍然按前面例子同样的步骤处理,就会得到71499100143210;095;3100l u -⎡⎤⎡⎤⎢⎥⎢⎥==-⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦ 但这时l 与u 乘起来并不等于原来的矩阵.l.u//MatrixForm143211322-⎡⎤⎢⎥⎢⎥⎢⎥⎣⎦实际上这时置换向量为p={2,1,3},表明矩阵中第一行与第二行交换了顺序.如果这时交换l 中相应的行,再乘上U 就会得到原来的矩阵.149210100;31l ⎡⎤⎢⎥=⎢⎥⎢⎥⎣⎦L.U//MatrixForm211143322⎡⎤⎢⎥-⎢⎥⎢⎥⎣⎦重构出L 与U 矩阵的更方便的方法是利用LUMatrices 命令,这条命令包含在软件包LinearAlgebra`MatrixManipulation`中.LUMatrices[lu]——返回一个列表,形式为{l,u},由对应于lu 的矩阵在LU 分解中被置换后的上三角与下三角矩阵组成,其中lu 为运行LUDecomposition[A]所得结果中的第一个元素.例11:自动求解例9中的L 、U运行<<LinearAlgebra`MatrixManipulation`调入软件包. 运行m={{2,1,1},{1,-4,3},{3,2,2}}; {lu,p,cond}=LUDecomposition[m]得数据{{{1, -4, 3}, {2, 9, -5}, {3, 14/9, 7/9}}, {2, 1, 3}, 1} 运行LUMatrices[lu] 得转换后的L 、U 矩阵{{1,0,0},{2,1,0},{3,14/9,1}},{{1,-4,3},{0,9,-5},{0,0,7/9}}} 由此可见可以自动提取转换后的L 、U 矩阵: L= LUMatrices[lu][[1]]; U= LUMatrices[lu][[2]];L[[p]]//MatrixForm (*L[[p]]根据向量p 对矩阵L 的行进行置换*)14921010031⎛⎫ ⎪ ⎪ ⎪⎝⎭U//MatrixForm7914309500-⎛⎫⎪- ⎪ ⎪⎝⎭运行下列命令,从结果可见L 与U 的乘积与原矩阵一致:L[[p]].U//MatrixForm211143322⎛⎫ ⎪- ⎪ ⎪⎝⎭例12:利用LU 分解法求解方程⎪⎪⎪⎭⎫⎝⎛=⎪⎪⎪⎭⎫ ⎝⎛-400320102423xLU 分解法的计算步骤:1.首先将方程组的系数矩阵进行LU 分解,得到A LU =.2.求解LY=b.3.求解UX=Y.(*输入数据*)A = {{3, 2, -4}, {2, 0, 1}, {0, 2, 3}}; b = {0, 0, 4};(*对A 进行LU 分解:A=LU*)Print["待求方程组为", MatrixForm[A], "x=", MatrixForm[b]]; n = Length[b];{lu, p, c} = LUDecomposition[A];Print["LU 分解的紧凑格式为", MatrixForm[lu]]; Print["置换向量为", p];l = lu SparseArray[{i_, j_} /; j < i -> 1, {n, n}] + IdentityMatrix[n]; Print["分离的L 矩阵为", MatrixForm[l]];u = lu SparseArray[{i_, j_} /; j >= i -> 1, {n, n}]; Print["分离的U 矩阵为", MatrixForm[u]]; (*求解Ly=b*)y = LinearSolve[l, b[[p]]]; Print["求解Ly=b 得:y=", y]; (*求解ux=y*)x = LinearSolve[u, y] // N; Print["方程组解为:x=", x];运行以上程序得:4线性方程组求解过程的可读性计算假设AX E =,其中A 为n 阶系数矩阵,E 为单位矩阵,即123=,,,,n E e e e e (),其中(1,2,)i e i n =为单位列向量,X 为n 个列向量构成的矩阵,即2(,,)i n X x x x =,其中,(1,2,)i x i n =为列向量.于是,可以把等式AX E =看作求解n 个线性方程组,(1,2,)i i Ax e i n ==出了所有i x 之后,也即得到了矩阵X .而由AX E =可知,矩阵X 是A 的逆矩阵,即1X A -=.这样就求出了A 的逆矩阵.于是求逆矩阵的过程被化成了解线性方程组的过程.我们利用Mathematica 软件实现对求逆矩阵的可读性计算,对我们探讨线性方程组的解法有非常重要的意义.4.1 求逆矩阵可读性计算我们编写可读性程序如下: (*求矩阵的逆矩阵*)运行InvMatr[A_] := (If[! MatrixQ[A],Print["A is not a Matrix, We don't calculate the inverse of A."], Print["Matrix A =", MatrixForm[A], ", "]; If[Det[A] == 0,Print["Because of Det[A]=0, There isn't inverse Matrix of A."], n = Length[A];ident = IdentityMatrix[n]; AT = Transpose[A]; Temp = AT;Do[Temp = Append[Temp, ident[[i]]], {i, 1, n}]; AE = Transpose[Temp];Print["(A|E)=", MatrixForm[AE]]; Do[k = Infinity; r = j;Do[ If[Abs[AE[[i, j]]] < k && AE[[i, j]] != 0, k = AE[[i, j]]; r = i], {i, j, n}];If[r != j, TempMatrix = AE[[r]]; AE[[r]] = AE[[j]]; AE[[j]] = TempMatrix];Do[AE[[i]] = AE[[i]] - AE[[j]]*AE[[i, j]]/AE[[j, j]], {i, 1, j - 1}];Do[AE[[i]] = AE[[i]] - AE[[j]]*AE[[i, j]]/AE[[j, j]], {i, j + 1, n}]; AE[[j]] = AE[[j]]/AE[[j, j]];Print["-->", MatrixForm[AE]]; , {j, 1, n} ];B = Transpose[AE]; Temp = {B[[n + 1]]};Do[Temp = Append[Temp, B[[i]]], {i, n + 2, 2 n}];Print["The Inverse Matrix A of is ", Transpose[Temp] // MatrixForm, "."] ] ] )为说明本程序可用于任何对矩阵的逆的各种情形的求解处理,举例计算如下.例13:已知a1={2,3,1,4};a2={3,0,2,5};a3={4,3,8};a4={2,7,4,15};A={a1,a2,a3,a4},求A 的逆阵. 运行Clear; a1={2,3,1,4}; a2={3,0,2,5}; a3={4,3,8}; a4={2,7,4,15}; A={a1,a2,a3,a4}; InvMatr[A]得:A is not a Matrix, We don't calculate the inverse of A. 如果我们输入的A 不是矩阵,我们不可求A 的逆阵.例14:求矩阵A=⎪⎪⎪⎪⎪⎭⎫⎝⎛64401800154012202的逆矩阵. 运行Clear;a1={2,0,2,2}; a2={1,0,4,5}; a3={1,0,0,8}; a4={1,0,4,64}; A={a1,a2,a3,a4}; InvMatr[A]得:Matrix A =⎪⎪⎪⎪⎪⎭⎫ ⎝⎛64401800154012202 Because of Det[A]=0, There isn't inverse Matrix of A.此时,A 的行列式为0,A 没有可逆阵.例15:求矩阵A=⎪⎪⎪⎭⎫ ⎝⎛--242022233的逆矩阵.Clear;a1={3,3,2};a2={2,-2,0}; a3={-2,4,2}; A={a1,a2,a3}; InvMatr[A]运行结果为:例16:求矩阵A= ⎪⎪⎪⎪⎪⎪⎭⎫⎝⎛3000023000023000023000023的逆矩阵Clear;a1={3,2,0,0,0};a2={0,3,2,0,0};a3={0,0,3,2,0};a4={0,0,0,3,2}; a5={0,0,0,0,3};A={a1,a2,a3,a4,a5}; InvMatr[A]通过上面的讨论我们可以看出该程序对任何一个矩阵型数据均能做出相应的处理,对输入的矩阵为可逆时,程序能计算出逆矩阵.进而我们通过Mathemtica 软件对解方程组也可实现可读性计算.4.2 线性方程组的可读性计算虽然Mathematica 软件中有解方程组的函数,但是,用此函数求解方程组存在不足之处:不能看到求解方程组的过程,也不能看到求解方程组的其他信息;输入方程组信息的形式繁琐且输出的内容不符合代数教材中通常的习惯,不能为其他程序提供更多的信息.而通过Mathematica 软件到底能不能对解线性方程组算法的实现将其过程展现出来呢?我们的答案是肯定的.只是在求解过程中,要运用到更多的输出形式函数.其程序相对较复杂.程序中较多的命令都是由简单命令复合而成,现对复合命名的构造过程进行描述.为了使实例17中的增广矩阵2-21-1121-42-2334-103-57812-11-2-1⎛⎫ ⎪ ⎪ ⎪⎪⎝⎭具有分块形式22111|214223|3410357|812112|1⎛⎫⎪⎪⎪ ⎪⎝⎭---------, 就需要在最后一列前插入符号“|”进行分隔,但Mathematica 中的矩阵是由行表构造而成,因此先用Transpose 命令对矩阵AUB 进行转置,并事先生成一个全由“|”为元素的一维表B0,一次性地把B0 插入到AUB 的转置矩阵的最后一行之前,然后再转置,就实现了我们希望的输出效果.完整的命令如下:B0=Table["|",{i,1,m}];MatrixForm[Transpose[Insert[Transpose[AUB],B0,n+1]]]Mathematica对表进行操作时是对表的每个元素进行同一操作,因此在对AUB 中找出的主元AUB(r,j)进行归一化处理时,可用下列命令实现对r行元素各除以AUB(r,j):AUB[[r]]=AUB[[r]]/AUB[[r,j]];为了把j 列除主元AUB(r,j)外的各元素全变成零,可对1 至r-1 行及r+1 至m 行分别进行第三类初等行变换.完整命令如下:Do[AUB[[i]]=AUB[[i]]-AUB[[r]]*AUB[[i,j]] ,{i,1,r-1}];Do[AUB[[i]]=AUB[[i]]-AUB[[r]]*AUB[[i,j]] ,{i,r+1,m}];处理解唯一时的输出时要解决的问题:AUB 的第n+1 列就是所求的解,但当m>n 时由于方程个数比未知量个数多,直接输出AUB(n+1)将出现多余的0,因此先把这些0 的位置存入表dele 中,再用Delete 命令把AUB(n+1)中多余的0 删除;为了把行向量以列的方式输出,由于Transpose 对一维表无效,因此把删除多余元素后的表放在{}中以增加其维数,最后形成的完整命令如下:dele=Table[{i},{i,n+1,m}];MatrixForm[Transpose[{Delete[Transpose[Simplify[AUB]][[n+1]], dele]}]]]下面是经过完整的求解线性方程组的可读性计算的完整程序:conslist = {C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13,C14, C15, C16, C17, C18, C19, C20, C21, C22, C23, C24, C25};varlist = {x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13,x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25}; MatrixPrint[A_] := (B0 = Table["|", {i, 1, m}];MatrixForm[Transpose[Insert[Transpose[AUB], B0, n + 1]]])PrintSolve[] := (ME = IdentityMatrix[S];basV = Complement[Table[i, {i, 1, n}], fuq];L = Length[basV];(*L 记录基变量的个数*)AUB = Transpose[AUB];eta = Table["", {S}];i = 0; eta[[i]] = AUB[[n + 1]];eta[[i]] = Table[eta[[i]][[j]], {j, 1, L}];Do[eta[[i]] = Insert[eta[[i]], 0, fuq[[k]]], {k, 1, S}];Do[eta[[i]] = -AUB[[fuq[[i]]]];eta[[i]] = Table[eta[[i]][[j]], {j, 1, L}];Do[eta[[i]] = Insert[eta[[i]], ME[[i, k]], fuq[[k]]], {k, 1,S}], {i, 1, S}];Ck = Table[conslist[[i]], {i, 1, n}];solv = MatrixForm[Transpose[{eta[[0]]}]];Do[solv = solv + MatrixForm[Transpose[{eta[[i]]}]]*Ck[[i]], {i, 1,n - r}];Print["X=", solv];)SolutionEquation[A_, B_] := (n = Length[A[[1]]]; m = Length[B];X = Table[varlist[[i]], {i, 1, n}]; AX = Dot[A, X];Print["求解下列线性方程组:"];Do[Print[AX[[i]], "=", B[[i]]], {i, 1, m}];Print["解:先对增广矩阵进行初等行变换:"];AUB = Transpose[Append[Transpose[A], B]];Print[MatrixPrint[Simplify[AUB]]];r = 1; fuq = {};(*fuq 存放自由未知量的下标*)Do[k = Infinity; flag = 0;(*查找列主元素的位置*)Do[If[AUB[[i, j]] != 0, flag = 1], {i, r, m}];If[flag == 0, fuq = Append[fuq, j]; Continue,Do[If[Abs[AUB[[i, j]]] < k && AUB[[i, j]] != 0, k = AUB[[i, j]]; t = i], {i, r, m}];If[t != r, TempMatrix = AUB[[t]];AUB[[t]] = AUB[[r]]; AUB[[r]] = TempMatrix];AUB[[r]] = AUB[[r]]/AUB[[r, j]];Do[AUB[[i]] = AUB[[i]] - AUB[[r]]*AUB[[i, j]], {i, 1, r - 1}];Do[AUB[[i]] = AUB[[i]] - AUB[[r]]*AUB[[i, j]], {i, r + 1, m}];Print["-->", MatrixPrint[Simplify[AUB]]];r = r + 1];, {j, 1, n}];r = r - 1;S = n - r;(*基础解系中解的个数*)Print[" 增广矩阵的秩r=", r, ", 未知量个数 n=", n, ";"];If[r == n, Print["结论:因为增广矩阵的秩等于未知量个数,方程组有唯一解:X=", dele = Table[{i}, {i, n + 1, m}];MatrixForm[Transpose[{Delete[Transpose[Simplify[AUB]][[n + 1]], dele]}]]], If[r == m, Print["结论:因为增广矩阵的秩等于方程个数且小于未知量个数,方程组有无穷多组解:"];PrintSolve[],If[AUB[[r + 1, n + 1]] != 0, Print["因为增广矩阵的秩小于未知量个数,但 dr+1!= 0,所给方程组无解"], Print["因为增广矩阵的秩小于未知量个数, 且dr+1=0,方程组有无穷多组解:"];PrintSolve[];];];];)说明:本程序可用于变量在25个内的任何线性方程组的求解,如果变量超过25个,只需要增加程序中conslist 与varlist 分量个数即可.例17:求解方程组⎪⎪⎩⎪⎪⎨⎧=-+-+=+-+-=+-+-=+-+-2342310634852232533354321543215432154321x x x x x x x x x x x x x x x x x x x x 在Mathematica 输入并运行:A={{3,-3,1,-1,1},{1,-5,2,-3,2},{5,-8,4,-3,6},{1,3,-2,4,-3}};b={3,2,10,2};SolutionEquation[A,b]即得到如下求解结果,其中所有内容全部由程序自动输出得到. 求解下列线性方程组: 3x1-3x2+x3-x4+x5=3 x1-5x2+2x3-3x4+2x5=2 5x1-8x2+4x3-3x4+6x5=10 x1+3x2−2x3+4x4−3x5=2例18:求解方程组⎪⎪⎩⎪⎪⎨⎧-=+-++=-++--=+-++=+-++1423412231245354321543215432154321x x x x x x x x x x x x x x x x x x x x 在Mathematica 输入并运行:A={{1,3,5,-4,2},{1,3,2,-2,1},{1,-4,1,1,-1},{1,2,1,-4,1}};b={1,-1,3,-1}; SolutionEquation[A,b]即得到如下求解结果,其中所有内容全部由程序自动输出得到.例19:求解线性方程组⎪⎪⎩⎪⎪⎨⎧-=+-=++=--=-+332523233231321321321x x x x x x x x x x x a1={1,2,-1};a2={1,-3,-1};a3={3,1,2};a4={-2,0,3};A={a1,a2,a3,a4};B={3,2,5,-3}; SolutionEquation[A,B]参考文献[1] 北京大学数学系几何与代数教研室前代数小组编.高等代数[M].北京:高等教育出版社,2003[2] 王绍恒,王艺静.利用Mathematica软件实现解线性方程组的可读性计算[J].重庆三峡学院学报,2009(3),25(3):143-146[3] 姜友谊,应宏,王绍恒.化实对称矩阵为对角矩阵的计算机算法[J].西南民族学院学报,2002,28(4):428-432[4] 张禾瑞,郝鈵新,高等代数(第五版)[M].北京:高等教育出版社,2007[5] 刘水强,王绍恒.利用初等行变换解线性矩阵方程[J].重庆三峡学院学报,2001,17(5):87-89[6] 徐士良.计算机常用算法[M].北京:清华大学出版社,2000.8.[7] 徐安农,科学计算引论:基于Mathematica的数值分析[M].北京:机械工业出版社,2010.8[8] 冯天祥,数值计算方法理论与实践研究[M].成都:西南交通大学出版社,2005[9] 阳明盛,林建华.Mathematica基础及数学软件[M],大连:大连理工大学出版社,2003[10][美] Rchard J. Gaylord,Samuel N.Kamin ,Paul R. Wellin著,耿勇译.数学软件Mathematica 入门[M].高等教育出版社,2001[11][美]D.尤金.Mathematica使用指南[M].邓建松,彭冉冉,译.北京:科学出版社,2002.。

相关文档
最新文档