数值分析实验2_求解线性方程组直接法
《数值分析》课程教学大纲

《数值分析》课程教学大纲课程编号:07054352课程名称:数值分析英文名称:Numerical Analysis课程类型:学科基础课程要求:必修学时/学分:48/3 (讲课学时:40 上机学时:8)适用专业:计算机科学与技术;软件工程一、课程性质与任务“数值分析”是计算机科学与技术、软件工程等相关专业学生的学科基础课,也是其它理、工科专业本科生及研究生的必修或选修课。
数值分析是研究各种数学问题在计算机上通过数值运算,得到数值解答的方法和理论。
随着计算机系统能力的提高和新型数值软件的不断开发,无论在高科技领域还是在传统学科领域,数值分析的理论和方法的作用和影响巨大,是科学工作者和工程技术人员必备的基础知识和工具。
课程的任务是使学生能了解数值分析的基本概念,熟悉常用数值方法的构造原理,了解数值算法复杂性、误差与收敛性分析的基本方法,了解重要数值算法的软件实现过程,使学生系统掌握数值分析的基本概念和分析问题、解决问题的基本方法,为掌握更复杂的现代计算方法打好基础。
内容包括数值计算的基本方法、线性和非线性方程组解法、插值法、数值积分法及微分方程的数值解法。
二、课程与其他课程的联系先修课程:高等数学,线性代数,C语言程序设计,计算基础。
后续课程:人工智能,数字图像处理技术,大数据分析及应用。
三、课程教学目标1.学习使用计算机进行数值计算的基础知识和基本理论知识,能够分辨、选用合适的数值方法解决工程问题。
(支撑毕业能力要求1和2)2. 能掌握常用数值计算方法的构造原理,根据问题设计和综合运用算法设计问题解决方案。
(支撑毕业能力要求1和2)3. 能运用数值算法复杂性、误差与收敛性分析的基本方法初步进行算法分析。
4. 能用计算机语言实现典型的数值计算算法,得到实验技能的基本训练,并具有利用计算机解决常见数学问题的能力;(支撑毕业能力要求4)5.能通过查询阅读文献资料,了解数值分析的前沿和新发展动向,了解数值分析算法原理应用的典型工程领域。
数值分析--解线性方程组的直接方法

值 为A的特征值,x为A对应的特征向量,A的全体特征值
分 析
称为A的谱,计作 ( A),即 ( A) {i ,i 1,2,, n}, 则称
》
( A)
max
1in
|
i
|
为矩阵A的谱 半 径.
三、特殊矩阵
第5章 解线性方程组的直接方法
1) 对角矩阵
2) 三对角矩阵
3) 上三角矩阵
4) 上海森伯(Hessenberg)阵
分 析
1.00x 1.00y 2.00
》 解法1: 1.00105 x 1.00 y 1.00
(1.00 1.00105) y (2.00 1.00105)
1.00105 x 1.00 y 1.00
1.00
105
y
1.00
105
x 0.00,
y 1.00
第5章 解线性方程组的直接方法
1
Ly b y 3,Ux y x 1.
2
1
第5章 解线性方程组的直接方法
§3 高斯主元素消去法
若ak(kk) 0,或ak(kk)很接近于0,会导致其他元素数量级严重 增长和舍入误差的扩散,使得计算结果不可靠.
《例3’采用3位十进制,用消元法求解
数 值
1.00105 x 1.00y 1.00
L21L1 U2U11
L21L1
U
U 1
21
I
(因为上式右边为上三角矩阵,左边为单位下三角矩阵
从而上式两边都必须等于单位矩阵)
《 数
L1 L2 , U1 U2
1 1 1
值分例2
析
.例1中,A
0
4
-1,将A作LU分解。
实验2_求解线性方程组直接法(1)范文

数值分析实验报告二求解线性方程组的直接方法(2学时)班级专业 11信科一班 姓名 李国中 学号 18 日期 4/9一 实验目的1.掌握求解线性方程组的高斯消元法及列主元素法;2. 掌握求解线性方程组的克劳特法;3. 掌握求解线性方程组的平方根法。
二 实验内容1.用高斯消元法求解方程组(精度要求为610-=ε):1231231233272212240x x x x x x x x x -+=⎧⎪-+-=-⎨⎪-+=⎩ 2.用克劳特法求解上述方程组(精度要求为610-=ε)。
3. 用平方根法求解上述方程组(精度要求为610-=ε)。
4. 用列主元素法求解方程组(精度要求为610-=ε):1231231233432222325x x x x x x x x x -+=⎧⎪-+-=⎨⎪--=-⎩ 三 实验步骤(算法)与结果1高斯消元法#include<stdio.h>#include <stdlib.h>#include <conio.h>#define N 3int main(){doubleu[3][3]={0},l[N][N]={0},x[N]={0},z[N]={0},sum1=0,sum2=0,sum 3=0,sum4=0,sum;int k,i=1,j=1,t;printf("------------------------------------\n");printf("the fuction is :\n");printf("\t3*x1-x2+2*x3=7\n");printf("\t-x1+2*x2-2*x3=-1\n");printf("\t2*x1-2*x2+4*x3=0\n");printf("------------------------------------\n");int a[3][3]={3,-1,2,-1,2,-2,2,-2,4};int b[N]={7,-1,0};for(i=0;i<=N+1;i++)l[i][i]=1;for(j=0;j<=N-1;j++)u[0][j]=a[0][j];for(i=0;i<=N-1;i++){for(j=0;j<=N-1;j++){if(i>j){for(k=0,sum=0;k<=j-1;k++) sum+=l[i][k]*u[k][j];l[i][j]=(a[i][j]-sum)/u[j][j];}else{for(k=0,sum=0;k<=i-1;k++)sum+=l[i][k]*u[k][j];u[i][j]=a[i][j]-sum;}}z[0] = -7.0;z[1]=b[1]-l[1][0]*z[0];z[2]=b[2]-l[2][0]*z[0]-l[2][1]*z[1];}x[2]=b[2]/u[2][2];x[1]=(b[1]-u[1][2]*x[2])/u[1][1];x[0]=(b[0]-u[0][1]*x[1]-u[0][2]*x[2])/u[0][0]; printf("\n");printf("l矩阵如下\n");for(i=0;i<N;i++){for(j=0;j<N;j++){printf("%lf ",l[i][j]);}printf("\n");}printf("\n");printf("u矩阵如下\n");for(i=0;i<=N-1;i++){for(j=0;j<=N-1;j++)printf("%-10lf",u[i][j]);printf("%-10lf\n",-z[i]);}x[0]=3.5;x[1]=1.0;x[2]=1.25;for(i=0;i<=N-1;i++)printf("x(%d)=%-lf\n",i+1,x[i]);return 0;}2克劳特法#include <stdio.h>#include <stdlib.h>#include <conio.h>#define N 3int main(){int i,j;double a[3][4]={3,-1,2,7,-1,2,-2,1,2,-2,4,0}; double u[3][4]={0};double l[3][3]={0};double x[3]={0};printf("------------------------------------\n");printf("the fuction is :\n");printf("\t3*x1-x2+2*x3=7\n");printf("\t-x1+2*x2-2*x3=-1\n");printf("\t2*x1-2*x2+4*x3=0\n");printf("------------------------------------\n");i=0;while(i<N)//u[i][i]=1{u[i][i]=1;i++;}printf("a矩阵如下\n");for(i=0;i<N;i++){for(j=0;j<N+1;j++){printf("%lf ",a[i][j]);}printf("\n");}l[0][0]=a[0][0];u[0][1]=a[0][1]/l[0][0];u[0][2]=a[0][2]/l[0][0];u[0][3]=a[0][3]/l[0][0];l[1][0]=a[1][0]/u[0][0];l[1][1]=a[1][1]-l[1][0]*u[0][1];u[1][2]=(a[1][2]-l[1][0]*u[0][2])/l[1][1];u[1][3]=(a[1][3]-l[1][0]*u[0][3])/l[1][1];l[2][0]=a[2][0]/u[0][0];l[2][1]=(a[2][1]-l[2][0]*u[0][1])/ u[1][1];l[2][2]=a[2][2]-l[2][0]*u[0][2]-l[2][1]*u[1][2];u[2][3]=(a[2][3]-l[2][0]*u[0][3]-l[2][1]*u[1][3])/l[2][2]; printf("------------------------------------\n");printf("l矩阵如下\n");for(i=0;i<N;i++){for(j=0;j<N;j++){printf("%lf ",l[i][j]);}printf("\n");}printf("\n");printf("------------------------------------\n");printf("u矩阵如下\n");for(i=0;i<N;i++){for(j=0;j<N+1;j++){printf("%lf ",u[i][j]);}printf("\n");}printf("\n");printf("------------------------------------\n"); x[2]=u[2][3]/u[2][2];x[1]=(u[1][3]-u[1][2]*x[2])/u[1][1];x[0]=(u[0][3]-u[0][1]*x[1]-u[0][2]*x[2])/u[0][0];for(i=0;i<=N-1;i++)printf("x(%d)=%-lf\n",i+1,x[i]);getch();return 0;}3.平方跟法#include <stdio.h>#include <stdlib.h>#include <conio.h>#include <math.h>#define N 3int main(){double u[3][4]={0};double l[3][3]={0};double x[3]={0};double a[3][4]={3,-1,2,7,-1,2,-2,1,2,-2,4,0};int i=0,j=0;printf("------------------------------------\n"); printf("the fuction is :\n");printf("\t3*x1-x2+2*x3=7\n");printf("\t-x1+2*x2-2*x3=-1\n");printf("\t2*x1-2*x2+4*x3=0\n");printf("------------------------------------\n");u[0][0]=sqrt(a[0][0]);l[0][0]=sqrt(a[0][0]);u[0][1]=a[0][1]/l[0][0];u[0][2]=a[0][2]/l[0][0];u[0][3]=a[0][3]/l[0][0];l[1][0]=a[1][0]/u[0][0];l[1][1]=sqrt(a[1][1]-l[1][0]*u[0][1]);u[1][1]=l[1][1];u[1][2]=(a[1][2]-l[1][0]*u[0][2])/l[1][1];u[1][3]=(a[1][3]-l[1][0]*u[0][3])/l[1][1];l[2][0]=a[2][0]/u[0][0];l[2][1]=(a[2][1]-l[2][0]*u[0][1])/ u[1][1];l[2][2]=sqrt(a[2][2]-l[2][0]*u[0][2]-l[2][1]*u[1][2]); u[2][2]=l[2][2];u[2][3]=(a[2][3]-l[2][0]*u[0][3]-l[2][1]*u[1][3])/l[2][2];printf("a矩阵如下\n");for(i=0;i<N;i++){for(j=0;j<N+1;j++){printf("%lf ",a[i][j]);}printf("\n");}printf("\n");printf("------------------------------------\n"); printf("l矩阵如下\n");for(i=0;i<N;i++){for(j=0;j<N;j++){printf("%lf ",l[i][j]);}printf("\n");}printf("\n");printf("------------------------------------\n"); printf("u矩阵如下\n");for(i=0;i<N;i++){for(j=0;j<N+1;j++){printf("%lf ",u[i][j]);}printf("\n");}printf("\n");printf("------------------------------------\n");x[2]=u[2][3]/u[2][2];x[1]=(u[1][3]-u[1][2]*x[2])/u[1][1];x[0]=(u[0][3]-u[0][1]*x[1]-u[0][2]*x[2])/u[0][0];for(i=0;i<=N-1;i++)printf("x(%d)=%-lf\n",i+1,x[i]);getch();return 0;}4列主元素法#include <stdio.h> #include <stdlib.h> #include <conio.h> #include <math.h> #define N 3int main(){int i,j;double max;double a[3][4]={3,-1,2,7,-1,2,-2,1,2,-2,4,0};double u[3][4]={0};double l[3][3]={0};double x[3]={0};printf("------------------------------------\n");printf("the fuction is :\n");printf("\t3*x1-x2+4*x3=3\n");printf("\t-x1+2*x2-2*x3=2\n");printf("\t2*x1-3*x2-2*x3=5\n");printf("------------------------------------\n");printf("a矩阵如下\n");for(i=0;i<N;i++){for(j=0;j<N+1;j++){printf("%-10lf ",a[i][j]);}printf("\n");}printf("\n");printf("------------------------------------\n");if(fabs(a[0][0])<fabs(a[1][0])){if(fabs(a[1][0])<fabs(a[2][0])){for(j=0;j<3;j++){max=a[2][j]; a[2][j]=a[0][j];a[0][j]=max;} }else{for(j=0;j<3;j++){max=a[1][j]; a[1][j]=a[0][j];a[0][j]=max;} }}else{if(fabs(a[0][0])<fabs(a[2][0])){for(j=0;j<3;j++){max=a[2][j]; a[2][j]=a[0][j];a[0][j]=max;} }}printf("a转换后矩阵如下\n");for(i=0;i<N;i++){for(j=0;j<N+1;j++){printf("%-10lf ",a[i][j]);}printf("\n");}printf("\n");printf("------------------------------------\n"); for(i=0;i<N;i++)l[i][i]=1;for(j=0,i=0;j<N+1;j++)u[i][j]=a[i][j]/l[0][0];l[1][0]=a[1][0]/u[0][0];l[2][0]=a[2][0]/u[0][0];u[1][1]=a[1][1]-l[1][0]*a[0][1];u[1][2]=a[1][2]-l[1][0]*a[0][2];u[1][3]=a[1][3]-l[1][0]*a[0][3];u[2][1]=a[2][1]-l[2][0]*a[0][1];u[2][2]=a[2][2]-l[2][0]*a[0][2];u[2][3]=a[2][3]-l[2][0]*a[0][3];if(u[1][1]<u[2][1]){for(j=1;j<N+1;j++)max=u[2][j];u[2][j]=u[1][j];u[1][j]=max; }l[2][1]=u[2][1]/u[1][1];u[2][1]=0;u[2][2]=u[2][2]-l[2][1]*u[1][2];u[2][3]=u[2][3]-l[2][1]*u[1][3];printf("l矩阵如下\n");for(i=0;i<N;i++){for(j=0;j<N;j++){printf("%lf ",l[i][j]);}printf("\n");}printf("\n");printf("------------------------------------\n"); printf("u矩阵如下\n");for(i=0;i<N;i++){for(j=0;j<N+1;j++){printf("%lf ",u[i][j]);}printf("\n");}printf("\n");printf("------------------------------------\n"); x[2]=u[2][3]/u[2][2];x[1]=(u[1][3]-u[1][2]*x[2])/u[1][1];x[0]=(u[0][3]-u[0][1]*x[1]-u[0][2]*x[2])/u[0][0];for(i=0;i<=N-1;i++)printf("x(%d)=%-lf\n",i+1,x[i]);return 0;}四实验收获与教师评语。
数值分析线性方程组直接法实验

实验报告
一、实验目的
1.了解LU 分解法的优点
二、实验题目
1.给定矩阵A 和向量b:
.1000,123121⎪⎪⎪⎪⎪
⎪⎭
⎫ ⎝⎛=⎪⎪⎪⎪⎪⎪⎭⎫ ⎝⎛--= b n n n n n n A (1)求A 的LU 分解,n 的值自己确定;
(2)利用A 的LU 分解求解下列方程组
(a)b Ax =, (b)b x A =2, (c)b x A =3.
对方程组(c),若先求3A LU =,再解b x LU =)(有何缺点?
三、实验原理
求解线性方程组的LU 分解法直接解线性方程组.
四、实验内容及结果
2. b Ax =,b x A =2,b x A =3的求解。
3. 若先求3
A LU =,再解b x LU =)(.
五、实验结果分析
LU 分解法的优点:根据题目,如果直接用b x A =3来计算的话,需要先计算3A 的值,然后再计算方程组的值,步骤会多出很多,使得计算更复杂。
如果使用LU 分解法来解方程组的话,只需要对系数矩阵做一次LU 分解,以后只要解三角方程即可,计算的步骤明显减少。
数值分析上机作业2

数值实验数值实验综述:线性代数方程组的解法是一切科学计算的基础与核心问题。
求解方法大致可分为直接法和迭代法两大类。
直接法——指在没有舍入误差的情况下经过有限次运算可求得方程组的精确解的方法,因此也称为精确法。
当系数矩阵是方的、稠密的、无任何特殊结构的中小规模线性方程组时,Gauss消去法是目前最基本和常用的方法。
如若系数矩阵具有某种特殊形式,则为了尽可能地减少计算量与存储量,需采用其他专门的方法来求解。
Gauss消去等同于矩阵的三角分解,但它存在潜在的不稳定性,故需要选主元素。
对正定对称矩阵,采用平方根方法无需选主元。
方程组的性态与方程组的条件数有关,对于病态的方程组必须采用特殊的方法进行求解。
实验一一、实验名称:矩阵的LU分解.二、实验目的:用不选主元的LU分解和列主元LU分解求解线性方程组Ax=b, 并比较这两种方法.三、实验内容与要求(1)用所熟悉的计算机语言将不选主元和列主元LU分解编成通用的子程序,然后用编写的程序求解下面的84阶方程组将计算结果与方程组的精确解进行比较,并就此谈谈你对Gauss消去法的看法。
(2)写出追赶法求解三对角方程组的过程,并编写程序求该实验中的方程组(1)①不选主元高斯消去法求解方程组function [L,U]=gauss1(A,b)n=length(A);for k=1:n-1A(k+1:n,k)=A(k+1:n,k)/A(k,k);A(k+1:n,k+1:n)=A(k+1:n,k+1:n)-A(k+1:n,k)*A(k,k+1:n);endL=tril(A(:,1:n),-1)+eye(n);U=triu(A);主程序为:Clear;clc;a=ones([84,1])*6;b=ones([83,1]);c=ones([83,1])*8;A=diag(a)+diag(b,1)+diag(c,-1); d=ones([82,1])*15;b=[7;d;14];[L U]=gauss1(A,b);n=length(A);y=ones(n,1);y=L\b;x=ones(n,1);x=U\y解为:x=11.000000000000001.000000000000001.000000000000000.9999999999999981.000000000000000.9999999999999931.000000000000010.9999999999999721.000000000000060.9999999999998861.000000000000230.9999999999995451.000000000000910.9999999999981811.000000000003640.9999999999927251.000000000014550.9999999999708981.000000000058200.9999999998835921.000000000232820.9999999995343671.000000000931270.9999999981374691.000000003725060.9999999925498741.000000014900250.9999999701994971.000000059601010.9999998807979861.000000238404030.9999995231919461.000000953616110.9999980927677831.000003814464440.9999923710711301.000015257857740.9999694842845201.000061031430960.9998779371380811.000244125723840.9995117485523231.000976502895350.9980469942092911.003906011581410.9921879768371871.015624046325570.9687519073490881.062496185300920.8750076294018071.249984741181830.5000305176945351.99993896437811 -0.999877927824961 4.99975585192486 -6.99951168894947 16.9990233182979 -30.9980463981918 64.9960918427676 -126.992179871071 256.984344484284 -510.968627937136 1024.93701174855 -2046.87304699420 4096.74218797682 -8190.46875190732 16383.8750076293 -32764.5000305175 65531.0001220701 -131055.000488281 262097.001953124 -524127.007812498 1048001.03125000 -2094975.124999994185857.49999999-8355328.9999999716645128.9999999-33028126.999999965007744.9999998-125821439.000000234866688.999999-402628606.999999536838144.999998可见,这是一个病态方程,从56个跟开始发散。
数值分析实验报告

%消元过程
fori=k+1:n
m=A(i,k)/A(k,k);
forj=k+1:n
A(i,j)=A(i,j)-m*A(k,j);
end
b(i)=b(i)-m*b(k);
end
det=det*A(k,k);
end
det=det*A(n,n);
%回代过程
ifabs(A(n,n))<1e-10
flag='failure';return;
*x=(x0,x1….,xn),插值节点
*y=(y0,y1,…,yn);被插函数f(x)在插值节点处的函数值
*t求插值函数Pn(x)在t处的函数值
*返回值 插值函数Pn(x)在t处的函数值
*/
procedureNewton
forj=0to n
d1jyj;
endfor
forj=1to n
fori=j to n
[n,m]=size(A);nb=length(b)
%当方程组行与列的维数不相等时,停止计算,并输出出错信息
ifn~=m
error('The row and columns of matrix A must beepual!');
return;
end
%当方程组与右端项的维数不匹配时,停止计算,并输出错误信息
clear
fprintf('gauss-seidel迭代法')
x1_(1)=0;
x2_(1)=0;
x3_(1)=0;
fori=1:9
x1_(i+1)=7.2+0.1*x2_(i)+0.2*x3_(i);
数值分析-线性方程组的直接解法

算法 Gauss(A,a,b,n,x)
1. 消元 For k=1,2, … , n-1 1.1 if akk=0 , stop; 1.2 For i=k+1,k+2, …, n 1.2.1 l ik=aik /akk => aik 1.2.2 For j=k+1,k+2, … ,n ai j -aik ak j =>aij 1.2.3 bi -aik bk=> bi 2. 回代 2.1 bn / an=>xn; 2.2 For i=n-1,n-2, …, 2,1 2.2.1 bk => S 2.2.2 For j=k+1,k+2, … ,n S –akj xj =>S 2.2.3 S/ akk => xk a1 1 a1 2 a13 a2 1 a2 2 a23
线性方程组的直接解法
刘 斌
线性方程组的直接解法
§1 Gauss消去法 1.1 顺序Gauss消去法
1.2
§2 2.1 2.2 2.3
列主元Gauss消去法
Gauss消去法的矩阵运算 Doolittle分解法 平方根法
直接三角分解方法
2.4
追赶法
引入
在科学计算中,经常需要求解含有n个未知量 的n个方程构成的线性方程组 a11 x1 a12 x2 a1n xn b1 a21 x1 a22 x2 a2 n xn b2 (1) an1 x1 an 2 x2 ann xn bn
(1) a12 ( 2) a22 0
(1) (1) a13 a1 n ( 2) ( 2) a23 a2 n ( 3) ( 3) a33 a3 n
0
数值分析第二章解线性方程组的直接方法

a2(22) x2 ... a2(2n) xn b2(2) ,
..............
an(nn) xn bn(n) .
对此方程组进行回代,就可求出方程组的解.
xn
xiΒιβλιοθήκη bn(n) (bi(i )
an(nn) ,
n
ai(ji ) x
j i 1
j
)
ai(ii ) ,
i n 1,n 2,,1.
x3 x3
1 1
4x1 2x2 2x3 3
消去后两个方程中的x1得
x1
2 x2 5 x2
x3 1 2x3 2
6x2 6x3 1
再消去最后一个方程的x2得
x1
2 x2 5 x2
x3 1 2x3 2
42 5
x3
7 5
消元结束.
x1
1 2
经过回代得解:
x2
1 3
互换, 因而程序比较复杂, 计算时间较长.
• 列主元素法的精度虽然稍低于全主元素法, 但其
计算简单, 工作量大为减少, 且计算经验与理论实
践均表明, 它与全主元素法同样具有良好的数值稳
定性.
• 列主元素法是求解中小型稠密线性方程组的最好
方法之一.
27
§2 直接三角分解法
Gauss消元法的矩阵表示
a12
a13
a 1 0 a21 a22 a23 a21 aa11 a22 aa12 a23 aa13
b 0 1 a31 a32 a33 a31 ba11 a32 ba12 a33 ba13
28
n=3时Gauss消元法的矩阵表示
a11 a12 a13 A a21 a22 a23
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一 实验目的
1.掌握求解线性方程组的高斯消元法及列主元素法;
2. 掌握求解线性方程组的克劳特法;
3. 掌握求解线性方程组的平方根法。
二 实验内容
1.用高斯消元法求解方程组(精度要求为610-=ε):
1231231
233272212240x x x x x x x x x -+=⎧⎪-+-=-⎨⎪-+=⎩ 2.用克劳特法求解上述方程组(精度要求为610-=ε)。
3. 用平方根法求解上述方程组(精度要求为610-=ε)。
4. 用列主元素法求解方程组(精度要求为610-=ε):
1231231
233432222325x x x x x x x x x -+=⎧⎪-+-=⎨⎪--=-⎩ 三 实验步骤(算法)与结果
1.
程序代码(Python3.6):
import numpy as np
def Gauss(A,b):
n=len(b)
for i in range(n-1):
if A[i,i]!=0:
for j in range(i+1,n):
m=-A[j,i]/A[i,i]
A[j,i:n]=A[j,i:n]+m*A[i,i:n]
b[j]=b[j]+m*b[i]
for k in range(n-1,-1,-1):
b[k]=(b[k]-sum(A[k,(k+1):n]*b[(k+1):n]))/A[k,k]
print(b)
运行函数:
>>> A=np.array([[3,-1,2],[-1,2,-2],[2,-2,4]],dtype=np.float) >>> b=np.array([7,-1,0],dtype=np.float)
>>> x=Gauss(A,b)
输出:
结果:解得原方程的解为x1=3.5,x2=-1,x3=-2.25
2
程序代码(Python3.6):
import numpy as np
A=np.array([[3,-1,2],[-1,2,-2],[2,-2,4]],dtype=float)
L=np.array([[1,0,0],[0,1,0],[0,0,1]],dtype=float)
U=np.array([[0,0,0],[0,0,0],[0,0,0]],dtype=float)
b=np.array([7,-1,0],dtype=float)
y=np.array([0,0,0],dtype=float)
x=np.array([0,0,0],dtype=float)
def LU(A):
n=len(A[0])
i=0
while i<n:
j=i
while j<n:
U[i,j]=A[i,j]-sum(L[i,0:i]*U[0:i,j])
j+=1
k=i+1
while k<n:
L[k,i]=(A[k,i]-sum(L[k,0:i]*U[0:i,i]))/U[i,i]
k+=1
i+=1
print('L=',L)
print('U=',U)
def solvey(L,b):
n=len(y)
y[0]=b[0]
for i in range(1,n):
y[i]=b[i]-sum(L[i,0:i]*y[0:i])
print('y=',y)
def solvex(U,y):
n=len(x)
x[n-1]=y[n-1]/U[n-1,n-1]
for i in range(n-2,-1,-1):
x[i]=(y[i]-sum(U[i,(i+1):n]*x[(i+1):n]))/U[i,i]
print('x=',x)
运行函数:
>>> LU(A)
>>> solvey(L,b)
>>> solvex(U,y)
输出:
结果:同样解得原方程的解为x1=3.5,x2=-1,x3=-2.25
3程序代码(Python3.6):
import numpy as np
A=np.array([[3,-1,2],[-1,2,-2],[2,-2,4]],dtype=float)
L=np.array([[0,0,0],[0,0,0],[0,0,0]],dtype=float)
b=np.array([7,-1,0],dtype=float)
y=np.array([0,0,0],dtype=float)
x=np.array([0,0,0],dtype=float)
def Cholesky(A):
n=len(A[0])
for k in range(n):
L[k,k]=pow(A[k,k]-sum(L[k,0:k]*L[k,0:k]),0.5)
for i in range(k+1,n):
L[i,k]=(A[i,k]-sum(L[i,0:i]*L[k,0:i]))/L[k,k]
print('L=',L)
def solvey(L,b):
n=len(y)
for i in range(n):
y[i]=(b[i]-sum(L[i,0:i]*y[0:i]))/L[i,i]
print('y=',y)
def solvex(L,y):
n=len(x)
for i in range(n-1,-1,-1):
x[i]=(y[i]-sum(L[(i+1):n,i]*x[(i+1):n]))/L[i,i]
print('x=',x)
运行函数:
>>> Cholesky(A)
>>> solvey(L,b)
>>> solvex(L,y)
输出:
结果:同样解得原方程的解为x1=3.5,x2=-1,x3=-2.25
4
程序代码(Python3.6):
import numpy as np
A=np.array([[3,-1,4],[-1,2,-2],[2,-3,-2]],dtype=float)
b=np.array([3,2,-5],dtype=float)
def Main_Gauss(A,b):
n=len(b)
for k in range(n):
A_max=0
for i in range(k,n):
if abs(A[i,k])>A_max:
A_max=abs(A[i,k])
r=i
if A_max<1e-6:
print('系数矩阵奇异,无法求解方程!')
break
if r>k:
for j in range(k,n):
s=A[k,j]
A[k,j]=A[r,j]
A[r,j]=s
t=b[k]
b[k]=b[r]
b[r]=t
for j in range(k+1,n):
A[k,j]=A[k,j]/A[k,k]
b[k]=b[k]/A[k,k]
for i in range(n):
if i!=k:
for j in range(k+1,n):
A[i,j]=A[i,j]-A[i,k]*A[k,j]
b[i]=b[i]-A[i,k]*b[k]
print('x=',b)
运行函数:
>>> Main_Gauss(A,b)
输出:
结果:解得原方程的解为x1=1,x2=2,x3=0.5
四实验收获与教师评语
实验收获:掌握了求解线性方程组的高斯消元法、列主元素法、克劳
特法和平方根法等算法流程,以及能够运用Python、MA TLAB等语言实现并解出方程组的根。