数值计算解线性方程组

高斯消元法

function x=solveGauss(A,b)
n=size(A,1);
x=zeros(n,1);
for j=1:n-1
    for i=j+1:n
        mul=A(i,j)/A(j,j);
        A(i,:)=A(i,:)-mul*A(j,:);
        b(i)=b(i)-mul*b(j);
    end
end
for i=n:-1:1
    sum=0;
    for j=n:-1:i+1
        sum=sum+x(j)*A(i,j);
    end
x(i)=(b(i)-sum)/A(i,i);
end
end

最快梯度下降法

function [x,k]=solveG(A,b,x0,rtol,itermax)
x=x0;
k=0;
r0=b-A*x;
r=r0;
while norm(r,2)>rtol&& k<itermax
      v=A*r;
      alpha=(r'*r)/(r'*v);
      x=x+alpha*r;
      r=r-alpha*v;
      k=k+1;
end
end

共轭梯度法,这是在最快下降法的基础上优化的

function [x,k]=solveCG(A,b,x0,rtol,itermax)
k=0;
x=x0;
r1=b-A*x0;
p=r1;
while norm(r1)>rtol && k<itermax
      v=A*p;
      alpha=(r1'*r1)/(p'*v)
      x=x+alpha*p;
      r2=r1-alpha*v;
      belta=(r2'*r2)/(r1'*r1);
      p=r2+belta*p;
      r1=r2;
      k=k+1;
end
end

用tic,toc来表示计算过程所花的时间

tic;
clear;
r=0.02;b=0.3;h=0.3;
nodes=[0 0;b/3 0;2*b/3 0;b 0;
       0 h/3;b/3 h/3;2*b/3 h/3;b h/3;
       0 2*h/3;b/3 2*h/3;2*b/3 2*h/3;b-r*sin(pi/6) h-r*cos(pi/6);
       b h-r;b-r*cos(pi/6) h-r*sin(pi/6);0 h;b/3 h;
       b/2 h;b-r h];
elements=[1 2 6 5;2 3 7 6;3 4 8 7;5 6 10 9;6 7 11 10;11 7 12 14;
          7 8 13 12;9 10 16 15;10 11 17 16;11 14 18 17];
dbc=[1 600;2 600;3 600;4 600;
     12 300;13 300;14 300;18 300];
 sysmat=zeros(18,18);rhs=zeros(18,1);
for n=1:size(elements,1)
     [elemat,elevec] = evaluate_stat(nodes(elements(n,:),:),gx2dref(2),gw2dref(2));
     [sysmat,rhs] = assemble(elemat,elevec,sysmat,rhs,elements(n,:));
end
[sysmat,rhs] = assignDBC(sysmat,rhs,dbc);
k=[];

 tic;
 T=sysmat\rhs;
 k(1)=toc;

 tic
 T=solveGauss(sysmat,rhs);
 k(2)=toc;

 tic
 T=solveG(sysmat,rhs,zeros(size(rhs)),1e-7, 1000);
 k(3)=toc;

 tic
 T=solveCG(sysmat,rhs,zeros(size(rhs)),1e-7, 1000);
 k(4)=toc;
% quadplot(nodes,elements,T)
% shading interp; grid on
% colormap(hot);
% colorbar
toc;

题目后面还有一问就是用构造出来的函数去解方程,把题目给的矩阵用Matlab构造出来,然后直接解方程就可以了

s=[10.0, 6.0, 5.1, 5.01, 5.001, 5.00001, 5.0000001, 5.000000001, 5.00000000001];
v=s(1,1)*ones(1,300);
a=-2*ones(1,299);
A1=diag(v);
A2=diag(a,-1);
A3=diag(a,1);
A=A1+A2+A3;
A(1,1)=1;
b=ones(300,1);
tic;
x=solveGauss(A,b);
%x=solveCG(A,b,x0,1e-7,10000)
%x=solveG(A,b,x0,1e-7,10000)
t=toc;

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值