1.高斯赛德尔迭代法的迭代矩阵
^迭代法写成x<-Bx+f之后迭代矩阵当然是B
不过问题在于不同的迭代法产生的B和f是不同的
在Jacobi迭代中A=D-L-U,Ax=b Dx=(L+U)x+b x=D^{-1}(L+U)x+D^{-1}b
所以B=D^{-1}(L+U)
在Gauss-Seidel迭代中同样A=D-L-U,但是Ax=b (D-L)x=Ux+b x=(D-L)^{-1}Ux+(D-L)^{-1}b
所以B=(D-L)^{-1}U
2.用c++写一个万能的高斯
这是 C 程序,你把头文件换成 c++,把 printf 改 cout 就可以了。
无论是几维数组 ?-- 数组大小还是维数?
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N 100
float *GauseSeidel(float *a,int n)
{
int i,j,nu=0;
float *x,dx;
x=(float *)malloc(n*sizeof(float));
for(i=0;i<=n-1;i++)
x[i]=0.0;
do {
for(i=0;i<=n-1;i++) {
float d=0.0;
for(j=0;j<=n-1;j++)
d+=*(a+i*(n+1)+j)*x[j];
dx=(*(a+i*(n+1)+n)-d)/(*(a+i*(n+1)+i));
x[i]+=dx;
}
if(nu>=N)
{
printf("iter divergence\n");
exit(1);
}
nu++;
}
while(fabs(dx)>1e-6);
return x;
}
void main()
{
int i;
float *x;
float c[12]={5,2,1,8,2,8,-3,21,1,-3,-6,1};
float *GauseSeidel(float *,int);
x=GauseSeidel(c,3);
for(i=0;i<=2;i++)
printf("x[%d]=%f\n",i,x[i]);
getch();
}
3.雅可比迭代法和高斯赛德尔迭代法的迭代矩阵怎么求
1. 用雅克比迭代法和高斯--赛德尔迭代法求解下列方程组,取迭代初值[0;0;0]。
(1) 编程求解,并与用数学软件求解的结果对比。(2) 考察迭代法的收敛性,若均收敛,对比两种方法的收敛速度。
解:源程序:①雅克比迭代法:建立函数文件jacobi.m function [n,x]=jacobi(A,b,X,nm,w)%用雅克比迭代法求解方程组Ax=b%输入:A为方程组的系数矩阵,b为方程组右端的列向量,X为迭代初值构成的列向量,nm为最大迭代次数,w为误差精度%输出:x为求得的方程组的解构成的列向量,n为迭代次数 n=1; m=length(A); D=diag(diag(A)); %令A=D-L-U,计算矩阵D L=tril(-A)+D; %令A=D-L-U,计算矩阵L U=triu(-A)+D; %令A=D-L-U,计算矩阵U M=inv(D)*(L+U); %计算迭代矩阵 g=inv(D)*b; %计算迭代格式中的常数项%下面是迭代过程 while n<=nm x=M*X+g; %用迭代格式进行迭代 if norm(x-X,2)
(2)由运行过程可知,两种方法均收敛,雅克比迭代次数为14,高斯赛德尔迭代次数为6,说明后者的迭代速度比前者快。2.用超松弛迭代法求解方程组,分别取松弛因子 ,取迭代初值[0;0;0],迭代30次或满足 时停止计算。
(1) 编程求解,并与用数学软件求解的结果对比。(2) 考察迭代是否收敛,若收敛,松弛因子取何值时收敛最快,与有关定理的结论对照,看结果是否一致。
解:源程序:①超松弛迭代法:建立函数文件sor22.m function [n,x]=sor22(A,b,X,nm,w,ww)%用超松弛迭代法求解方程组Ax=b%输入:A为方程组的系数矩阵,b为方程组右端的列向量,X为迭代初值构成的列向量,nm为最大迭代次数,w为误差精度,ww为松弛因子%输出:x为求得的方程组的解构成的列向量,n为迭代次数 n=1; m=length(A); D=diag(diag(A)); %令A=D-L-U,计算矩阵D L=tril(-A)+D; %令A=D-L-U,计算矩阵L U=triu(-A)+D; %令A=D-L-U,计算矩阵U M=inv(D-ww*L)*((1-ww)*D+ww*U); %计算迭代矩阵 g=ww*inv(D-ww*L)*b; %计算迭代格式中的常数项%下面是迭代过程 while n<=nm x=M*X+g; %用迭代格式进行迭代 if norm(x-X,'inf') // Seidel.h:interface for the CSeidel class.////////////////////////////////////////////////////////////////////////#if !defined(AFX_SEIDEL_H__35754D65_C3B8_4814_B9D7_8DE3BA72EFF3__INCLUDED_)#define AFX_SEIDEL_H__35754D65_C3B8_4814_B9D7_8DE3BA72EFF3__INCLUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000//Seidel算法//方法取自《计算方法引论》(第二版)徐萃薇、孙绳武著 高等教育出版社 第187页//Matrix--系数矩阵,Y--常数项,X0--初始值,dimension--方程的阶数,error--误差;//count--计算次数,达到次数即使不满足精度也返回积分值//计算结果在X0中.class CSeidel {public:static bool Seidel(double *Matrix,double *Y,double *X0,int dimension,double error,int count);CSeidel();virtual CSeidel();};#endif // !defined(AFX_SEIDEL_H__35754D65_C3B8_4814_B9D7_8DE3BA72EFF3__INCLUDED_)// Seidel.cpp:implementation of the CSeidel class.////////////////////////////////////////////////////////////////////////#include "stdafx.h"//#include "NumericalMethods.h"#include "Seidel.h"#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE[]=__FILE__;#define new DEBUG_NEW#endif//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////CSeidel::CSeidel(){}CSeidel::CSeidel(){}//Seidel算法//方法取自《计算方法引论》(第二版)徐萃薇、孙绳武著 高等教育出版社 第187页//Matrix--系数矩阵,Y--常数项,X0--初始值,dimension--方程的阶数,error--误差;//count--计算次数,达到次数即使不满足精度也返回积分值//计算结果在X0中.#define Matrix(row,col) (*(Matrix+(row)*dimension+col))bool CSeidel::Seidel(double *Matrix,double *Y,double *X0,int dimension,double error,int count){int i,j,k=1;double *X=new double[dimension];double sum;do{sum=0.0f;for(i=1;i。 去百度文库,查看完整内容> 内容来自用户:w___w000 function[x,k]=GaussSeidel(A,b,x0,eps,M) %高斯赛德尔迭代法求方程组的解(矩阵公式求解) %A为方程组的系数矩阵;b为方程组的右端项 %x为线性方程组的解了;x0为迭代初值 %eps为误差限;M为迭代的最大次数 if nargin==3 eps= 1.0e-6;%默认精度 M = 10000;%参数不足时默认后两个条件 elseif nargin ==4 M = 10000;%参数的默认值 elseif nargin<3 error('参数不足'); return end [n,m]=size(A); nb=length(b); %当方程组行与列的维数不相等时,停止计算,并输出出错信息 if n~=m error('矩阵A行数和列数必须相等!'); return; end %当方程组与右端项的维数不匹配时,停止计算,并输出出错信息 if n~=nb error('矩阵A的行数必须和b的长度相等!'); return; end L =zeros(n,n); U =zeros(n,n); D =zeros(n,n); for i=2:n for j=1:i-1 L(i,j)=-A(i,j); end end for i=1:n-1 for j=i+1:n U(i,j)=-A(i,j); end end for i=1:n D(i,i)=A(i,i); end B=inv(D-L)*U; %B为迭代矩阵 g=inv(D-L)*b; %g为右端项 pr=max(abs(eig(B))); %求迭代矩阵谱半径 if pr>=1 error('迭代矩阵谱半径大于1迭代法不收敛'); return; end k=0; tol=1; while tol>=eps x = B*x0+g; k = k+1; %迭代步数 tol = norm(x-x0);%前后 %Gauss-Seidel迭代法解线性方程组的Gauss-Seidel函数 %A为未知数的系数矩阵;b为方程组右边常值列向量;x0取ones(m,1)m为未知数个数;eps为精度,如果不输入eps,默认为1.0e-6 function [x,n]=GaussSeidel(A,b,x0,eps) if nargin==3 eps=1.0e-6; elseif narginerror; return; end D=diag(diag(A)); L=-tril(A,-1); U=-triu(A,1); G=(D-L)\U; f=(D-L)\b; x=G*x0+f; n=1; while norm(x-x0)>=eps x0=x; x=G*x0+f; n=n+1; end A=diag(ones(1,50)*12); A=A+[[zeros(49,1) -2*diag(ones(1,49))];zeros(1,50)]; A=A+[[zeros(1,49); -2*diag(ones(1,49))] zeros(50,1)]; A=A+[[zeros(48,2) diag(ones(1,48))];zeros(2,50)]; A=A+[[zeros(2,48); diag(ones(1,48))] zeros(50,2)]; b=ones(50,1)*5; x=gseid(A,b,zeros(50,1),0.001,1000) 转载请注明出处育才学习网 » 高斯赛德尔矩阵怎么写4.怎样用高斯
5.高斯赛德尔迭代法matlab编程
6.求助在matlab中如何实现高斯赛德尔迭代法
7.Matlab 高斯