数值分析编程及运行结果(高斯顺序消元法)

合集下载

数值分析实验,用程序实现Gauss消元法

数值分析实验,用程序实现Gauss消元法

《数值分析》实验报告实验序号:实验一实验名称:一实验目的:用Microsoft visual c++编写一个功能与Windows 计算器一样的计算器。

二实验内容:(1)算法介绍:计算方法分析:Gauss消元法的基本做法就是把方程组转化成为一个如下图的等价的三角方程组,这个过程叫做消元。

得到三角方程组后,就可以逐个求出Xn,Xn-1,…,X1,这个过程叫回代。

程序代码分析:建立两个数组a和b,通过循环语句将n阶增广矩阵输入进去,通过对列的循环对每一列进行消去未知数,通过n小步n大步把矩阵化简成上三角形矩阵,最后通过迭代法解得方程组得解。

(2)算法分析:程序中只用到一个主函数,求解线形方程组得算法都放在主函数中,利用以下函数进行求解:a[i][j] = a[i][j] - (a[i][k] / a[k][k]) * a[k][j];迭代:x[n] = a[n][n + 1] / a[n][n];for(i = n - 1;i >= 1;i --){sum = 0.0;for(j = n;j >= i + 1;j --){sum = sum + a[i][j] * x[j];}//cout << sum << endl;x[i] = (a[i][n + 1] - sum) / a[i][i];}(3)原代码:#include<iostream>#include <stdio.h>#include <cmath>#define N 1000using namespace std;double a[N][N];double b[N];int main(){int n,i,j,k;double m;double x[N];printf("***Gauss消元法***:\n\n");while(printf("输入矩阵的阶数:")){scanf("%d",&n);printf("输入增广矩阵:\n");for(i=1;i<=n;i++){for(j=1;j<=n;j++){scanf("%lf",&a[i][j]); ;}scanf("%lf",&b[i]);}for(i=1;i<n;i++){for(k=i+1;k<=n;k++){m=a[k][i]*1/a[i][i]*1;for(j=i;j<=n;j++){a[k][j]= a[k][j]-a[i][j]*m;}b[k]= b[k]-b[i]*m*1;}printf("经过第%d大步后增广矩阵为:\n",i);for(int l=1;l<=n;l++){for(j=1;j<=n;j++)printf("%f ",a[l][j]);printf("%f ",b[l]);printf("\n");}}for(i=n;i>0;i--){double sum=0;for(j=i+1;j<=n;j++){sum =sum+a[i][j]*x[j]*1;}x[i]=(b[i]-sum)*1/a[i][i]*1;}printf("线性方程组的解为: \n");for(i=1;i<=n;i++){if(x[i]==0)x[i]=abs(x[i]);printf("x[%d]=%f\n",i,x[i]);}}return 0;}三实验截图:四实验结果分析:消去第k个元素时,对矩阵作加法和乘法各(n-k)*(n-k)次,除法运算(n-k)次,对右端作加法和乘法各(n-k)次,加法和乘法运算分别各n*(n-1)*(n-1/2)/3和n*(n-1)/2次,消元时还有n*(n-1)/2次除法运算,另外回代过程加法和乘法运算各n*(n-1)/2,除法运算n次。

数值分析编程及运行结果(高斯顺序消元法)课案

数值分析编程及运行结果(高斯顺序消元法)课案

高斯消元法1.程序:clearformat ratA=input('输入增广矩阵A=')[m,n]=size(A);for i=1:(m-1)numb=int2str(i);disp(['第',numb,'次消元后的增广矩阵']) for j=(i+1):mA(j,:)=A(j,:)-A(i,:)*A(j,i)/A(i,i);endAend%回代过程disp('回代求解')x(m)=A(m,n)/A(m,m);for i=(m-1):-1:1x(i)=(A(i,n)-A(i,i+1:m)*x(i+1:m)')/A(i,i); endx2.运行结果:高斯选列主元消元法1.程序:clearformat ratA=input('输入增广矩阵A=')[m,n]=size(A);for i=1:(m-1)numb=int2str(i);disp(['第',numb,'次选列主元后的增广矩阵']) temp=max(abs(A(i:m,i)));[a,b]=find(abs(A(i:m,i))==temp);tempo=A(a(1)+i-1,:);A(a(1)+i-1,:)=A(i,:);A(i,:)=tempodisp(['第',numb,'次消元后的增广矩阵'])for j=(i+1):mA(j,:)=A(j,:)-A(i,:)*A(j,i)/A(i,i);endAend%回代过程disp('回代求解')x(m)=A(m,n)/A(m,m);for i=(m-1):-1:1x(i)=(A(i,n)-A(i,i+1:m)*x(i+1:m)')/A(i,i); endx2.运行结果:追赶法1.程序:function [x,L,U]=zhuiganfa(a,b,c,f)a=input('输入矩阵-1对角元素a=');b=input('输入矩阵对角元素b=');c=input('输入矩阵+1对角元素c=');f=input('输入增广矩阵最后一列元素f='); n=length(b);% 对A进行分解u(1)=b(1);for i=2:nif(u(i-1)~=0)l(i-1)=a(i-1)/u(i-1);u(i)=b(i)-l(i-1)*c(i-1);elsebreak;endendL=eye(n)+diag(l,-1);U=diag(u)+diag(c,1);x=zeros(n,1);y=x;% 求解Ly=by(1)=f(1);for i=2:ny(i)=f(i)-l(i-1)*y(i-1); end% 求解Ux=yif(u(n)~=0)x(n)=y(n)/u(n);endfor i=n-1:-1:1x(i)=(y(i)-c(i)*x(i+1))/u(i); end2.运行结果:高斯-塞德尔迭代格式1.程序:function x=Gauss_Seidel(a,b)a=input('输入系数矩阵a=')b=input('输入增广矩阵最后一列b=');e=0.5e-7;n=length(b);N=50;x=zeros(n,1);t=zeros(n,1);for k=1:Nsum=0;E=0;t(1:n)=x(1:n);for i=1:nx(i)=(b(i)-a(i,1:(i-1))*x(1:(i-1))-a(i,(i+1):n)*t((i+1):n))/a(i,i);endif norm(x-t)<ekbreak;endend2.运行结果:雅戈比迭代格式1.程序:function x=Jocabi(a,b)a=input('输入系数矩阵a=');b=input('输入增广矩阵最后一列b=');e=0.5e-7;n=length(b);N=100;x=zeros(n,1);y=zeros(n,1);for k=1:Nsum=0;for i=1:ny(i)=(b(i)-a(i,1:n)*x(1:n)+a(i,i)*x(i))/a(i,i);endfor i=1:nsum=sum+(y(i)-x(i))^2;endif sqrt(sum)<ekbreak;elsefor i=1:nx(i)=y(i);endendendif k==N warning('未能找到近似解'); end2.运行结果:逐次超松弛法(SOR)1.程序:function [n,x]=sor22(A,b,X,nm,w,ww)%用超松弛迭代法求解方程组Ax=b%输入:A为方程组的系数矩阵,b为方程组右端的列向量,X为迭代初值构成的列向量,nm为最大迭代次数,w为误差精度,ww为松弛因子%输出:x为求得的方程组的解构成的列向量,n为迭代次数A=input('输入系数矩阵A=');b=input('输入方程组右端的列向量b=');X=input('输入迭代初值构成的列向量X=');nm=input('输入最大迭代次数nm=');w=input('输入误差精度w=');ww=input('输入松弛因子ww=');n=1;m=length(A);D=diag(diag(A)); %令A=D-L-U,计算矩阵DL=tril(-A)+D; %令A=D-L-U,计算矩阵LU=triu(-A)+D; %令A=D-L-U,计算矩阵UM=inv(D-ww*L)*((1-ww)*D+ww*U); %计算迭代矩阵g=ww*inv(D-ww*L)*b; %计算迭代格式中的常数项%下面是迭代过程while n<=nmx=M*X+g; %用迭代格式进行迭代if norm(x-X,'inf')<wdisp('迭代次数为');ndisp('方程组的解为');xreturn;%上面:达到精度要求就结束程序,输出迭代次数和方程组的解endX=x;n=n+1;end%下面:如果达到最大迭代次数仍不收敛,输出警告语句及迭代的最终结果(并不是方程组的解)disp('在最大迭代次数内不收敛!');disp('最大迭代次数后的结果为');2.运行结果:二分法求解方程的根1.程序:%其中a,b表示查找根存在的范围,M表示要求解函数的值%f(x)表示要求解根的方程%eps表示所允许的误差大小function y=er_fen_fa(a,b,M)k=0;eps=0.05while b-a>epsx=(a+b)/2;%检查是否大于值if ((x^3)-3*x-1)>Mb=xelsea=xendk=k+1end2.运行结果:Newton 迭代法(切线法)1.程序:function x=nanewton(fname,dfname,x0,e,N)%newton迭代法解方程组%fname和dfname分别表示F(x)及其导函数的M函数句柄或内嵌函数,x0为迭代初值,e为精度要求x=x0;x0=x+2*e;k=0;if nargin<5,N=500;endif nargin<4 e=1e-4;endwhile abs(x0-x)>e&k<N,k=k+1;x0=x;x=x0-feval(fname,x0)/feval(dfname,x0);disp(x)endif k==N,warning('已达迭代次数上限');end2.运行结果:割线方式迭代法1.程序:function x=ge_xian_fa(fname,dfname,x0,x1,e,N)%割线方式迭代法解方程组%fname和dfname分别表示F(x)及其导函数的M函数句柄或内嵌函数,x0,x1分别为迭代初值,e为精度要求k=0;a=x1;b=x0;if nargin<5,N=500;endif nargin<4 e=1e-4;endwhile abs(a-b)>e&k<N,k=k+1;x=x1-((x1-x0)/(feval(fname,x1)-feval(fname,x0)))*feval(fname,x1);if feval(fname,x)*feval(fname,x0)>0,x0=x;b=x0;elsex1=x;a=x1;endx=x1-((x1-x0)/(feval(fname,x1)-feval(fname,x0)))*feval(fname,x1);numb=int2str(k);disp(['第',numb,'次计算后x='])fprintf('%f\n\n',x);endif k==N,warning('已达迭代次数上限'); end2.运行结果:Newton插值1.程序:%保存文件名为New_Int.m%Newton基本插值公式%x为向量,全部的插值节点%y为向量,差值节点处的函数值%xi为标量,是自变量%yi为xi出的函数估计值function yi=newton_chazhi(x,y,xi)n=length(x);m=length(y);if n~=merror('The lengths of X ang Y must be equal!'); return;end%计算均差表YY=zeros(n);Y(:,1)=y';for k=1:n-1for i=1:n-kif abs(x(i+k)-x(i))<epserror('the DATA is error!');return;endY(i,k+1)=(Y(i+1,k)-Y(i,k))/(x(i+k)-x(i)); endend%计算牛顿插值公式yi=0;for i=1:nz=1;for k=1:i-1z=z*(xi-x(k));endyi=yi+Y(1,i)*z;end2.运行结果:Lagrange插值1.程序:function y0 = Language(x,y,x0)syms t l;if length(x)==length(y)n = length(x);elsedisp('x和y的维数不相等!');return; %检错endh=sym(0);for i=1:nl=sym(y(i));for j=1:i-1l=l*(t-x(j))/(x(i)-x(j));end;for j=i+1:nl=l*(t-x(j))/(x(i)-x(j));end;h=h+l;endsimplify(h);if nargin == 3y0 = subs (h,'t',x0); %计算插值点的函数值elsey0=collect(h);y0 = vpa(y0,6); %将插值多项式的系数化成6位精度的小数end2.运行结果:最小二乘法1.程序:function p=nafit(x,y,m)%多项式拟合% x, y为已知数据点向量, 分别表示横,纵坐标, m为拟合多项式的次数, 结果返回m次拟合多项式系数, 从高次到低次存放在向量p 中.A=zeros(m+1,m+1);for i=0:mfor j=0:mA(i+1,j+1)=sum(x.^(i+j));endb(i+1)=sum(x.^i.*y);enda=A\b';p=fliplr(a');t=0:0.1:1.6;S3=polyval(p,t);plot(x,y,'p k');hold onplot(t,S3,'r');2.运行结果:。

数值分析计算方法实验报告

数值分析计算方法实验报告
break;
end;
end;
X=x;
disp('迭代结果:');
X
format short;
输出结果:
因为不收敛,故出现上述情况。
4.超松弛迭代法:
%SOR法求解实验1
%w=1.45
%方程组系数矩阵
clc;
A=[2,10,0,-3;-3,-4,-12,13;1,2,3,-4;4,14,9,-13]
b=[10,5,-2,7]'
b=[10,5,-2,7]'
[m,n]=size(A);
if m~=n
error('矩阵A的行数和列数必须相同');
return;
end
if m~=size(b)
error('b的大小必须和A的行数或A的列数相同');
return;
end
if rank(A)~=rank([A,b])
error('A矩阵的秩和增广矩阵的秩不相同,方程不存在唯一解');
3.实验环境及实验文件存档名
写出实验环境及实验文件存档名
4.实验结果及分析
输出计算结果,结果分析和小结等。
解:1.高斯列主元消去法:
%用高斯列主元消去法解实验1
%高斯列主元消元法求解线性方程组Ax=b
%A为输入矩阵系数,b为方程组右端系数
%方程组的解保存在x变量中
format long;
A=[2,10,0,-3;-3,-4,-12,13;1,2,3,-4;4,14,9,-13]
return;
end
c=n+1;
A(:,c)=b;
for k=1:n-1

数值分析列主元高斯消去法

数值分析列主元高斯消去法

实验四:列组元消去法一、目的1)熟悉列主元高斯消元法解线性方程组的算法2)掌握列主元高斯消去法的编程二、实验原理列主元素消去法是为控制舍入误差而提出来的一种算法,在Gauss消去法的消元过程中,若出现a=0,则消元无法进行,即使其不为0,但很小,把它作为除数,就会导致其他元素量级的巨大增长和舍入误差的扩散,最后使计算结果不可靠.使用列主元素消去法计算,基本上能控制舍入误差的影响,并且选主元素比较方便.三、运行结果四、代码using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace高斯{class Program{static double[] Gause(double[,] a, int n){int i, j, k;int rank, columm;double temp, l, s, mx;double[] x = new double[n];for (i = 0; i <= n - 2; i++){mx = Math.Abs(a[i, i]);rank = i;columm = i;for (j = i + 1; j <= n - 1; j++) //选主元if (Math.Abs(a[j, i]) > mx){mx = Math.Abs(a[j, i]);rank = j;columm = i;}for (k = 0; k <= n; k++) //主元行变换{temp = a[i, k];a[i, k] = a[rank, k];a[rank, k] = temp;} //消元for (j = i + 1; j <= n - 1; j++){l = a[j, i] / a[i, i];for (k = i; k <= n; k++)a[j, k] = a[j, k] - l * a[i, k];}}x[n - 1] = a[n - 1, n] / a[n - 1, n - 1]; //回代方程求解x for (i = n - 2; i >= 0; i--){s = 0;for (j = i + 1; j <= n - 1; j++)s = s + a[i, j] * x[j];x[i] = (a[i, n] - s) / a[i, i];}return x;}static void Main(string[] args){double[,] a = new double[4, 5] { { 10, -7, 0, 1, 8 }, { -3, 2.099999, 6, 2, 5.900001 }, { 5, -1, 5, -1, 5 }, { 2, 1, 0, 2, 1 } };int n = 4;double[] x = new double[n];x = Gause(a, n);Console.WriteLine("高斯消去法方程:");for (int i = 0; i < n; i++){for (int j = 0; j < n; j++)Console.Write(a[i, j].ToString() + " ");Console.WriteLine();}Console.WriteLine("线性方程组的解:");for (int i = 0; i <= n - 1; i++)Console.Write("x" + (i + 1).ToString() + "=" +x[i].ToString() + " ");Console.WriteLine();Console.ReadLine();}}}四、分析通过本次实验的学习,学会根据算法编写基本的相关程序,虽然此次程序模板由老师给予,但认真阅读理解程序有助于今后的学习,再利用计算机中的C语言对高斯列主元消去法可以快速得到线性方程组的解,由简单的线性方程组可以推广到一般n阶线性方程组,这对如何利用高斯列主元消去法解决实际问题有了一定的经验。

数值分析4 高斯主元素消去法

数值分析4 高斯主元素消去法

§2高斯主元素消去法⎪⎩⎪⎨⎧=++-=++=++00.357.404.100.200.224.563.200.100.100.200.10120.0321321321x x x x x x x x x 解:clear alla=[0.0120 1.00 2.00;1.00 2.63 5.24;-2.00 1.04 4.57]; b=[1.00;2.00;3.00];x=a\b方程组的三位有效数字的解:Tx )266.0,476.0,645.0(*-=Gauss 消去法求解(取三位有效数字):[]⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡---−−→−⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡------−−−→−⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡-==-==00.300.5003.811627.80000.100.200.10120.016432916603.811627.80000.100.200.10120.000.357.404.100.200.224.563.200.100.100.200.10120.006.21673.83323121l l l b A 解出Tx )60.0,197.0,25.0(--≈。

【注】1)设Ax=b,其中A 为n 阶非奇异矩阵,可以应用高斯消元法。

2)消元过程中,即使0)(≠k kk a ,用其作除数)/()()(k kk k ik ik a a l =会导致计算中间结果数量级严重增长和舍入误差的累积、扩大,最后使得计算结果不可靠。

3)应避免采用绝对值很小的主元素)(k kk a ;对一般的系数矩阵,最好保持乘数1≤ik l ,因此,在高斯消去法中应引进选主元技巧,以便减少计算过程中舍入误差对求解的影响。

clear alla=[0.0120 1.00 2.00;1.00 2.63 5.24;-2.00 1.04 4.57]; b=[1.00;2.00;3.00];x_value=vpa(a\b,15)%10位有效数字的近似解a=[a,b];eps=1e-6;[n,m]=size(a);Gauss,x=vpa(x,15) %对比高斯消去法的结果一、列主元素消去法基本思想:在每轮消元之前,选列主元素(绝对值最大的元素),使乘数(即消元因子)1≤ik l步骤:设已进行k-1轮消元,得矩阵⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡=)()()()()2(2)2(2)2(22)1(1)1(1)1(12)1(11)(k nn k nkk kn k kkn kn kk a a a a a a a a a a a A一落千丈 1 23S1:选列主元素: )()(0max k ik ni k k k i a a ≤≤= (1)S2:换行:如果)(0k k i a →0,则方程组解不唯一,停止运算; 否则,如果i0=k , 则可进行下一轮消元;如果k i ≠0,则r i0 r k ,然后进行下一轮消元。

数值分析高斯顺序消去法、列主元消去法LU分解法

数值分析高斯顺序消去法、列主元消去法LU分解法

数值分析实验报告(1)学院:信息学院班级:计算机0903班姓名:***学号:********课题一A.问题提出给定下列几个不同类型的线性方程组,请用适当的方法求解线性方程组1、设线性方程组⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡--------------------------1368243810041202913726422123417911101610352431205362177586832337616244911315120130123122400105635680000121324⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡10987654321x x x x x x x x x x =⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡-2119381346323125 x *= ( 1, -1, 0, 1, 2, 0, 3, 1, -1, 2 )T2、设对称正定阵系数阵线方程组⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡----------------------19243360021411035204111443343104221812334161206538114140231212200420424⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡87654321x x x x x x x x = ⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡---4515229232060 x * = ( 1, -1, 0, 2, 1, -1, 0, 2 )T3、三对角形线性方程组⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡------------------4100000000141000000001410000000014100000000141000000001410000000014100000000141000000001410000000014⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡10987654321x x x x x x x x x x = ⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡----5541412621357 x *= ( 2, 1, -3, 0, 1, -2, 3, 0, 1, -1 )TB.(1)对上述三个方程组分别用Gauss 顺序消去法与Gauss 列主元消去法;平方根 与改进平方根法;追赶法求解(选择其一) (2)编写算法通用程序(3)在应用Gauss 消去时,尽可能利用相应程序输出系数矩阵的三角分解式C.(1)通过该课题的程序编制,掌握模块化结构程序设计方法 (2)掌握求解各类线性方程组的直接方法,了解各种方法的特点 (3)体会高斯消去法选主元的必要性 实验步骤:(高斯消去法,列主元,LU )1顺序高斯消去法2.LU 分解法3.列主元高斯消去法(如下图)(1)高斯消去法运行结果如下(2)对方程的系数矩阵进行LU分解并求出方程组的解(3)列主元高斯消去法实验体会总结:利用gauss消去法解线性方程组的时候,如果没有经过选主元,可能会出现数值不稳定的现象,使得方程组的解偏离精确解。

数值分析列主元高斯消去顺序高斯平方根法追赶法

数值分析列主元高斯消去顺序高斯平方根法追赶法

课题名称:课题一解线性方程组的直接方法解决的问题:给定三个不同类型的线性方程组,用适当的直接法求解。

采用的数值方法:对第一个普通的线性方程组,采用了高斯顺序消去法和高斯列主元消去法。

对第二个正定线性方程组,采用了平方根法。

对第三个三对角线性方程组,采用了追赶法。

算法程序:(1)普通的线性方程组①顺序消去法#include<stdio.h>#include<math.h>int main(void){float A[10][10]= {{4,2,-3,-1,2,1,0,0,0,0},{8,6,-5,-3,6,5,0,1,0,0},{4,2,-2,-1,3,2,-1,0,3,1},{0,-2,1,5,-1,3,-1,1,9,4},{-4,2,6,-1,6,7,-3,3,2,3},{8,6,-8,5,7,17,2,6,-3,5},{0,2,-1,3,-4,2,5,3,0,1},{16,10,-11,-9,17,34,2,-1,2,2},{4,6,2,-7,13,9,2,0,12,4},{0,0,-1,8,-3,-24,-8,6,3,-1}};float b[10]= {5,12,3,2,3,46,13,38,19,-21}; float x[10]= {0};float Aik,S,temp;int i,j,k;int size=10;for(k=0; k<size-1; k++){if(!A[k][k])return -1;for(i=k+1; i<size; i++){Aik=A[i][k]/A[k][k];for(j=k; j<size; j++){A[i][j]=A[i][j]-Aik*A[k][j]; }b[i]=b[i]-Aik*b[k];}}printf("A[]\n");for(i=0; i<size; i++){for(j=0; j<size; j++)printf("%f ",A[i][j]);printf("\n");}printf("b[]\n");for(i=0; i<size; i++)printf("%f ",b[i]);printf("\n\n");x[size-1]=b[size-1]/A[size-1][size-1]; for(k=size-2; k>=0; k--){S=b[k];for(j=k+1; j<size; j++){S=S-A[k][j]*x[j];}x[k]=S/A[k][k];}printf("x[]=\n");for(i=0; i<size; i++)printf("%f ",x[i]);return 0;}②列主元消去法#include<stdio.h>#include<math.h>int main(void){float A[10][10]= {{4,2,-3,-1,2,1,0,0,0,0}, {8,6,-5,-3,6,5,0,1,0,0},{4,2,-2,-1,3,2,-1,0,3,1},{0,-2,1,5,-1,3,-1,1,9,4},{-4,2,6,-1,6,7,-3,3,2,3},{8,6,-8,5,7,17,2,6,-3,5},{0,2,-1,3,-4,2,5,3,0,1},{16,10,-11,-9,17,34,2,-1,2,2},{4,6,2,-7,13,9,2,0,12,4},{0,0,-1,8,-3,-24,-8,6,3,-1}};float b[10]= {5,12,3,2,3,46,13,38,19,-21}; float x[10]= {0};float Aik,S,temp;int i,j,k;float max;int col;int size=10;for(k=0; k<size-1; k++){max=fabs(A[k][k]);col=k;for(i=k; i<size; i++){if(max<fabs(A[i][k])) {max=fabs(A[i][k]); col=i;}}for(j=k; j<size; j++){temp=A[col][j];A[col][j]=A[k][j];A[k][j]=temp;}temp=b[col];b[col]=b[k];b[k]=temp;if(!A[k][k])return -1;for(i=k+1; i<size; i++){Aik=A[i][k]/A[k][k]; for(j=k; j<size; j++){A[i][j]=A[i][j]-Aik*A[k][j]; }b[i]=b[i]-Aik*b[k];}}printf("A[]\n");for(i=0; i<size; i++){for(j=0; j<size; j++)printf("%f ",A[i][j]);printf("\n");}printf("b[]\n");for(i=0; i<size; i++)printf("%f ",b[i]);printf("\n\n");x[size-1]=b[size-1]/A[size-1][size-1]; for(k=size-2; k>=0; k--){S=b[k];for(j=k+1; j<size; j++){S=S-A[k][j]*x[j]; }x[k]=S/A[k][k];}printf("x[]=\n");for(i=0; i<size; i++)printf("%f ",x[i]);return 0;}(2)对称正定线性方程组平方根法:#include <stdio.h>#include <math.h>#define n 8int main(void){float A[8][8]={{4,2,-4,0,2,4,0,0},{2,2,-1,-2,1,3,2,0},{-4,-1,14,1,-8,-3,5,6},{0,-2,1,6,-1,-4,-3,3},{2,1,-8,-1,22,4,-10,-3},{4,3,-3,-4,4,11,1,-4},{0,2,5,-3,-10,1,14,2},{0,0,6,3,-3,-4,2,19}};float g[8][8]= {0};float b[8]= {0,-6,6,23,11,-22,-15,45}; float x[8]= {0};float y[8]= {0};int k,m,i,sq;for(k=0; k<n; k++){float p=0,q=0,s=0;for(m=0; m<=k-1; m++){p=p+A[k][m]*A[k][m];}g[k][k]=sqrt(A[k][k]-p);A[k][k]=g[k][k];for(i=k+1; i<n; i++){q=0;for(m=0; m<=k-1; m++){q=q+A[i][m]*A[k][m];}g[i][k]=(A[i][k]-q)/A[k][k]; A[i][k]=g[i][k];}s=0;for(m=0; m<=k-1; m++){s=s+A[k][m]*y[m];}y[k]=(b[k]-s)/A[k][k];}x[n-1]=y[n-1]/A[n-1][n-1];for(k=n-2; k>=0; k--){float sum=0;for(m=k+1; m<n; m++){sum=sum+A[m][k]*x[m];}x[k]=(y[k]-sum)/A[k][k];}for(sq=0; sq<n; sq++){printf("%f ",x[sq]);}return 0;}(3)三对角线性方程组追赶法#include <stdio.h>#include <math.h>#define n 10int main(void){float a[10]={4,4,4,4,4,4,4,4,4,4};float c[9]={-1,-1,-1,-1,-1,-1,-1,-1,-1};float d[9]={-1,-1,-1,-1,-1,-1,-1,-1,-1}; float b[10]={7,5,-13,2,6,-12,14,-4,5,-5}; float x[10]={0};float y[10]={0};float arf[10]={0};float bt[9]={0};arf[0]=a[0];int i;for(i=0;i<n-1;i++){bt[i]=c[i]/arf[i];arf[i+1]=a[i+1]-d[i+1]*bt[i];//printf("%f %f \n",bt[i],arf[i+1]); }y[0]=b[0]/arf[0];//printf("%f\n",y[0]);for(i=1;i<n;i++){y[i]=(b[i]-d[i]*y[i-1])/arf[i];}//printf("%f\n",y[1]);x[n-1]=y[n-1];for(i=n-2;i>=0;i--){x[i]=y[i]-bt[i]*x[i+1]; }for(i=0;i<n;i++)printf("%lf ",x[i]);return 0;}数值结果:(1) 普通的线性方程组①顺序消去法②列主元消去法(2) 对称正定线性方程组平方根法:(3)三对角线性方程组追赶法:对实验计算结果的讨论和分析:(1) 普通的线性方程组①顺序消去法x1~x10的绝对误差:0.000001,-0.000001,0.000001,0,0.000001,0,0.000002,0,0,0x1~x10的相对误差:0.000001,0.000001,-1,0,0.0000005,0,0.00000067,0,0,0误差很小,基本可以忽略。

数值分析(05)高斯消元法

数值分析(05)高斯消元法

n=length(b); X=zeros(n,1); A的第i行、第i+1到n列元素 X(n)=b(n)/A(n,n); 构成的行向量 for i=n-1:-1:1 X(i)=(b(i)-A(i,i+1:n)* X(i+1:n))/A(i,i); end xn bn / ann
xi (bi

4 7 13 13
解: x4 1 x1 x2 x2 x3 0
3 x3
3 0
x3 2
x1 x2 x2

3
2
求解上三角方程组 Ax=b
for i= n : – 1 : 2
b ( i ) = b ( i ) / A ( i , i );
r ( A) r ( A)方程组Ax b无解(即不相容)。 常见是m n,称为超定方程组(又称矛盾方程组) 此时,向量b不在A的列空间R( A)之中,原方程组 无解,但可求出最小二乘意义下的解 x。 即求 x使 || b Ax ||2 2 min
MATLAB实现:
x=A\b
a1n xn b1 a2 n xn b2 ann xn bn
将 原 方 程 组 Ax b 化 为 同 解 的 上 三 角 方 组 程 Ux g 初 等 变 换 Ax b 同解 用增广矩阵表示为
一、三角形方程组的解法
x2 x2 x3 3 x3
x4 5 x4 13 x4 13 x4

4 7 13 13
为求解上三角方程组,从最后一个方程入手,先 a11 x1 a12 x2 .............................. a1n xn b1 解出 xn=bn/ann , 然后按方程由后向前的顺序,从方程 a x2 ............................. a2 n xn b2 22 中依次解出 xn-1,xn-2,…,x ....................................... .. 1。这样就完成了上三角方程组 的求解过程。这个过程被称为回代过程其计算步骤如 an1n1 xn1 an1n xn bn 1 下: ann xn bn
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

高斯消元法1.程序:clearformat ratA=input('输入增广矩阵A=')[m,n]=size(A);for i=1:(m-1)numb=int2str(i);disp(['第',numb,'次消元后的增广矩阵']) for j=(i+1):mA(j,:)=A(j,:)-A(i,:)*A(j,i)/A(i,i);endAend%回代过程disp('回代求解')x(m)=A(m,n)/A(m,m);for i=(m-1):-1:1x(i)=(A(i,n)-A(i,i+1:m)*x(i+1:m)')/A(i,i); endx2.运行结果:高斯选列主元消元法1.程序:clearformat ratA=input('输入增广矩阵A=')[m,n]=size(A);for i=1:(m-1)numb=int2str(i);disp(['第',numb,'次选列主元后的增广矩阵']) temp=max(abs(A(i:m,i)));[a,b]=find(abs(A(i:m,i))==temp);tempo=A(a(1)+i-1,:);A(a(1)+i-1,:)=A(i,:);A(i,:)=tempodisp(['第',numb,'次消元后的增广矩阵'])for j=(i+1):mA(j,:)=A(j,:)-A(i,:)*A(j,i)/A(i,i);endAend%回代过程disp('回代求解')x(m)=A(m,n)/A(m,m);for i=(m-1):-1:1x(i)=(A(i,n)-A(i,i+1:m)*x(i+1:m)')/A(i,i); endx2.运行结果:追赶法1.程序:function [x,L,U]=zhuiganfa(a,b,c,f)a=input('输入矩阵-1对角元素a=');b=input('输入矩阵对角元素b=');c=input('输入矩阵+1对角元素c=');f=input('输入增广矩阵最后一列元素f='); n=length(b);% 对A进行分解u(1)=b(1);for i=2:nif(u(i-1)~=0)l(i-1)=a(i-1)/u(i-1);u(i)=b(i)-l(i-1)*c(i-1);elsebreak;endendL=eye(n)+diag(l,-1);U=diag(u)+diag(c,1);x=zeros(n,1);y=x;% 求解Ly=by(1)=f(1);for i=2:ny(i)=f(i)-l(i-1)*y(i-1); end% 求解Ux=yif(u(n)~=0)x(n)=y(n)/u(n);endfor i=n-1:-1:1x(i)=(y(i)-c(i)*x(i+1))/u(i); end2.运行结果:高斯-塞德尔迭代格式1.程序:function x=Gauss_Seidel(a,b)a=input('输入系数矩阵a=')b=input('输入增广矩阵最后一列b=');e=0.5e-7;n=length(b);N=50;x=zeros(n,1);t=zeros(n,1);for k=1:Nsum=0;E=0;t(1:n)=x(1:n);for i=1:nx(i)=(b(i)-a(i,1:(i-1))*x(1:(i-1))-a(i,(i+1):n)*t((i+1):n))/a(i,i);endif norm(x-t)<ekbreak;endend2.运行结果:雅戈比迭代格式1.程序:function x=Jocabi(a,b)a=input('输入系数矩阵a=');b=input('输入增广矩阵最后一列b=');e=0.5e-7;n=length(b);N=100;x=zeros(n,1);y=zeros(n,1);for k=1:Nsum=0;for i=1:ny(i)=(b(i)-a(i,1:n)*x(1:n)+a(i,i)*x(i))/a(i,i);endfor i=1:nsum=sum+(y(i)-x(i))^2;endif sqrt(sum)<ekbreak;elsefor i=1:nx(i)=y(i);endendendif k==N warning('未能找到近似解'); end2.运行结果:逐次超松弛法(SOR)1.程序:function [n,x]=sor22(A,b,X,nm,w,ww)%用超松弛迭代法求解方程组Ax=b%输入:A为方程组的系数矩阵,b为方程组右端的列向量,X为迭代初值构成的列向量,nm为最大迭代次数,w为误差精度,ww为松弛因子%输出:x为求得的方程组的解构成的列向量,n为迭代次数A=input('输入系数矩阵A=');b=input('输入方程组右端的列向量b=');X=input('输入迭代初值构成的列向量X=');nm=input('输入最大迭代次数nm=');w=input('输入误差精度w=');ww=input('输入松弛因子ww=');n=1;m=length(A);D=diag(diag(A)); %令A=D-L-U,计算矩阵DL=tril(-A)+D; %令A=D-L-U,计算矩阵LU=triu(-A)+D; %令A=D-L-U,计算矩阵UM=inv(D-ww*L)*((1-ww)*D+ww*U); %计算迭代矩阵g=ww*inv(D-ww*L)*b; %计算迭代格式中的常数项%下面是迭代过程while n<=nmx=M*X+g; %用迭代格式进行迭代if norm(x-X,'inf')<wdisp('迭代次数为');ndisp('方程组的解为');xreturn;%上面:达到精度要求就结束程序,输出迭代次数和方程组的解endX=x;n=n+1;end%下面:如果达到最大迭代次数仍不收敛,输出警告语句及迭代的最终结果(并不是方程组的解)disp('在最大迭代次数内不收敛!');disp('最大迭代次数后的结果为');2.运行结果:二分法求解方程的根1.程序:%其中a,b表示查找根存在的范围,M表示要求解函数的值%f(x)表示要求解根的方程%eps表示所允许的误差大小function y=er_fen_fa(a,b,M)k=0;eps=0.05while b-a>epsx=(a+b)/2;%检查是否大于值if ((x^3)-3*x-1)>Mb=xelsea=xendk=k+1end2.运行结果:Newton 迭代法(切线法)1.程序:function x=nanewton(fname,dfname,x0,e,N)%newton迭代法解方程组%fname和dfname分别表示F(x)及其导函数的M函数句柄或内嵌函数,x0为迭代初值,e为精度要求x=x0;x0=x+2*e;k=0;if nargin<5,N=500;endif nargin<4 e=1e-4;endwhile abs(x0-x)>e&k<N,k=k+1;x0=x;x=x0-feval(fname,x0)/feval(dfname,x0);disp(x)endif k==N,warning('已达迭代次数上限');end2.运行结果:割线方式迭代法1.程序:function x=ge_xian_fa(fname,dfname,x0,x1,e,N)%割线方式迭代法解方程组%fname和dfname分别表示F(x)及其导函数的M函数句柄或内嵌函数,x0,x1分别为迭代初值,e为精度要求k=0;a=x1;b=x0;if nargin<5,N=500;endif nargin<4 e=1e-4;endwhile abs(a-b)>e&k<N,k=k+1;x=x1-((x1-x0)/(feval(fname,x1)-feval(fname,x0)))*feval(fname,x1);if feval(fname,x)*feval(fname,x0)>0,x0=x;b=x0;elsex1=x;a=x1;endx=x1-((x1-x0)/(feval(fname,x1)-feval(fname,x0)))*feval(fname,x1);numb=int2str(k);disp(['第',numb,'次计算后x='])fprintf('%f\n\n',x);endif k==N,warning('已达迭代次数上限'); end2.运行结果:Newton插值1.程序:%保存文件名为New_Int.m%Newton基本插值公式%x为向量,全部的插值节点%y为向量,差值节点处的函数值%xi为标量,是自变量%yi为xi出的函数估计值function yi=newton_chazhi(x,y,xi)n=length(x);m=length(y);if n~=merror('The lengths of X ang Y must be equal!'); return;end%计算均差表YY=zeros(n);Y(:,1)=y';for k=1:n-1for i=1:n-kif abs(x(i+k)-x(i))<epserror('the DATA is error!');return;endY(i,k+1)=(Y(i+1,k)-Y(i,k))/(x(i+k)-x(i)); endend%计算牛顿插值公式yi=0;for i=1:nz=1;for k=1:i-1z=z*(xi-x(k));endyi=yi+Y(1,i)*z;end2.运行结果:Lagrange插值1.程序:function y0 = Language(x,y,x0)syms t l;if length(x)==length(y)n = length(x);elsedisp('x和y的维数不相等!');return; %检错endh=sym(0);for i=1:nl=sym(y(i));for j=1:i-1l=l*(t-x(j))/(x(i)-x(j));end;for j=i+1:nl=l*(t-x(j))/(x(i)-x(j));end;h=h+l;endsimplify(h);if nargin == 3y0 = subs (h,'t',x0); %计算插值点的函数值elsey0=collect(h);y0 = vpa(y0,6); %将插值多项式的系数化成6位精度的小数end2.运行结果:最小二乘法1.程序:function p=nafit(x,y,m)%多项式拟合% x, y为已知数据点向量, 分别表示横,纵坐标, m为拟合多项式的次数, 结果返回m次拟合多项式系数, 从高次到低次存放在向量p 中.A=zeros(m+1,m+1);for i=0:mfor j=0:mA(i+1,j+1)=sum(x.^(i+j));endb(i+1)=sum(x.^i.*y);enda=A\b';p=fliplr(a');t=0:0.1:1.6;S3=polyval(p,t);plot(x,y,'p k');hold onplot(t,S3,'r');2.运行结果:。

相关文档
最新文档