Matlab-9:中心差分方法解常微分算例(SOR完整版)

时间:2023-03-09 19:43:30
Matlab-9:中心差分方法解常微分算例(SOR完整版)

Matlab-9:中心差分方法解常微分算例(SOR完整版)

函数文件:

 function [x,n,flag]=sor(A,b,eps,M,max1)
%sor函数为用松弛迭代法求解线性方程组
%A为线性方程组的系数矩阵
%b为线性方程组的常数向量
%eps为精度要求
%M为超弛因子
%max1为最大迭代次数
%u为线性方程组的解
%n为迭代次数
%flag为指标变量,flag='OK!'表示迭代收敛达到指标要求
%flag='fail!'表示迭代失败
if nargin<5
max1=10000;
end
if nargin<4
M=1;
end
if nargin<3
eps=1e-11;
end
k=length(A);
n=0;
x=zeros(k,1);
y=zeros(k,1);
flag='OK!';
while 1
y=x;
for i=1:k
z=b(i);
for j=1:k
if j~=i
z=z-A(i,j)*x(j);
end
end
if abs(A(i,i))<1e-10 | n==max1
flag='fail!';
return;
end
z=z/A(i,i);
x(i)=(1-M)*x(i)+M*z;
end
if norm(y-x,inf)<eps
break;
end
n=n+1;
end

脚本文件:

 tic;
clear
clc
N=100;
h=1/N;
x=0:h:1;
for i=1:length(x)
Accurate(i)=sin(4*pi*x(i));
end
Accurate=Accurate';%精确解
A=diag(2/h^2*ones(N+1,1))+diag(-1/h^2*ones(N,1),1)+diag(-1/h^2*ones(N,1),-1);
A(1,1)=1;
A(1,2)=0;
A(N+1,N+1)=1;
A(N+1,N)=0;
b=zeros(N+1,1);
for i=1:N-1
b(i+1,1)=16*pi^2*sin(4*pi*x(i+1)); %右端函数
end
u0=zeros(N+1,1);
[u,n]=GaussSeid(A,b,u0)
numerial=u;%数值解 toc;
figure(1)
plot(x,Accurate,'r *',x,numerial,'g v');
legend('Accurate','numerial');
xlabel('x');
ylabel('y');
grid on;
toc;
figure(2)
plot(x,numerial-Accurate,'r *');
legend('error');
xlabel('x');
ylabel('y');
grid on;