计算方法1-3章存档

Posted on 2022-05-20 21:57  Capterlliar  阅读(71)  评论(2编辑  收藏  举报

线上考试查询用

教材:数值计算方法  第3版  朱建新  李有法  编  高等教育出版社

第一章  误差

绝对误差:e*(x)

相对误差:er(x)=e*(x)/x

舍入误差:计算机计算时产生的误差

误差传播规律:(二元为例)P8

 迭代算法稳定性:P9

第二章  非线性方程求根

1.二分法

代码:

function [it,l]=half(l,r,eps)
f=@(x) exp(x)+10*x-2;%方程
it=0;%迭代次数
it_limit=30;%迭代次数限制
while r-l>=eps
    a=feval(f,l);
    b=feval(f,r);
    if a*b>0
        fprintf('不符合要求\n');
        break;
    else
        it=it+1;
        if it>it_limit
            fprintf('迭代次数过大\n');
            break;
        end
        mid=(l+r)/2;
        x=feval(f,mid);
        if a*x<0
            r=mid;
        else
            l=mid;
        end
    end
end
    
View Code

    误差分析:(b-a)/2k+1

  2.迭代法

    普通迭代:将方程变形为x=g(x),任选一点x0,获得x1=g(x0),x1向y=x作交点,将纵坐标转为横坐标,重复以上过程。

    几何意义:

    

    迭代法收敛的2个充分条件:P18

    牛顿迭代法

任选一近似根,方程在近似根处展开,以一阶导逼近真值。

几何意义:在近似根处作切线,以切线和x轴交点横坐标作为新近似根,重复以上过程。

代码:

function[it,x]=newton(x0,eps)
f=@(x) exp(x)+10*x-2;%原函数
fd=@(x) exp(x)+10;%导数
it_limit=30;%迭代次数限制
it=0;%迭代次数
x=x0;
xb=x+999;
while abs(x-xb)>=eps
    if it>it_limit
        fprintf('迭代次数超限:it=%3.0f\n',it);
        break;
    end
    y=feval(f,x);
    y1=feval(fd,x);
    if abs(y1)<1e-10
        fprintf('导数为零')
        break;
    end
    xb=x;
    x=xb-y/y1;
    it=it+1;
end
View Code

充分条件:P23

误差:|xk+1-xk|

收敛阶

 

    牛顿法收敛阶分析:P29(转化为余项)

 第三章  线性代数方程组的解法

1.高斯消元法(PPT1

顺序消元

代码:(作业要求,用的时候把round去了

function x=gauss(A,b)
N=size(A);
n=N(1);
x=zeros(n,1);
for i=1:(n-1)
    for j=(i+1):n
        if(A(i,i)==0)
            disp('0 error');
        end
        m=roundn(A(j,i)/A(i,i),-4);
        A(j,i:n)=roundn(A(j,i:n)-m*A(i,i:n),-4);
        b(j)=roundn(b(j)-m*b(i),-4);
    end
end
x(n)=roundn(b(n)/A(n,n),-4);
for i=n-1:-1:1
    x(i)=roundn((b(i)-sum(A(i,i+1:n)*x(i+1:n)))/A(i,i),-4);
end
View Code

2.列主元消元法

每次排序选最大的主元,避免舍入误差

代码:

function x=vpgauss(A,b)
N=size(A);
n=N(1);
x=zeros(n,1);
zz=zeros(1,n);
for i=1:(n-1)
    [~,p]=max(abs(A(i:n,i)));%~表示忽略第一维
    zz=A(i,:);%获取第i行
    A(i,:)=A(p+i-1,:);
    A(p+i-1,:)=zz;
    temp=b(i);
    b(i)=b(i+p-1);
    b(i+p-1)=temp;%交换
    for j=(i+1):n
        if(A(i,i)==0)
            disp('0 error');
        end
        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);
    end
end
x(n)=b(n)/A(n,n);
for i=n-1:-1:1
    x(i)=(b(i)-sum(A(i,i+1:n)*x(i+1:n)))/A(i,i);
end
View Code

3.三角分解法 -> 追赶法

P48、49

4.范数(PPT2

模(距离)的延伸定义

性质:1.非负性  2.齐次性  3.三角不等式  P52

矩阵三种范数:P54

5.迭代法(PPT3

已知AX=b,寻找一个迭代矩阵B,令X=BX+f,重复计算,逼近答案。可视作非线性方程求根在高位线性情况的延伸。

雅可比迭代法

把每条方程解出一个变量表达式,提出系数矩阵作为B和f。

分量表达式:P57

代码:(参数里的b和x竖着

function [n,it,y] = Jacobiit(A,b,x,it_limit)
fprintf('雅可比迭代法\n'); 
D=diag(diag(A));
B=inv(D)*(D-A);
n=norm(B);
b=inv(D)*b;
it=0;
while 1
    it=it+1;
    if(it>it_limit)
        fprintf('迭代次数超界 \n');
        break
    end
    y=B*x+b;
    if(norm(y-x,inf)<1e-3)%求范数
        break;
    else
        x=y;
    end
end
View Code

高斯-赛德尔迭代法

把雅可比迭代法前面解出的变量马上代入后面,希望能求得更快。但有时雅可比快,有时高斯-赛德尔快。

分量表达式:P58

代码:

function [it,y] = GaussSeidelit(A,b,x,it_limit)
fprintf('高斯-赛德尔迭代法\n'); 
DL=tril(A);
B=inv(DL)*(DL-A);
b=inv(DL)*b;
it=0;
while 1
    it=it+1;
    if(it>it_limit)
        fprintf('迭代次数超界 \n');
        break
    end
    y=B*x+b;
    if(norm(y-x)<1e-3)
        break;
    else
        x=y;
    end
end
View Code

收敛条件与误差估计

P59

雅可比和高斯-赛德尔迭代收敛充分条件:1.按行或按列严格对角占优  2.A正定  

矩阵迭代收敛充要条件:迭代矩阵B谱半径绝对值小于1

逐次超松弛迭代法

给高斯-赛德尔迭代法选一个玄学松弛因子w(P65

代码:

function [it,y] = SORit(w,A,b,x,it_limit)
fprintf('逐次超松弛迭代法\n');
D=diag(diag(A));
L=-tril(A,-1);%提取下三角
U=-triu(A,1);%提取上三角
B=inv(D-w*L)*((1-w)*D+w*U);
b=w*inv(D-w*L)*b;
it=0;
while 1
    it=it+1;
    if(it>it_limit)
        fprintf('迭代次数超界 \n');
        break
    end
    y=B*x+b;
    if(norm(y-x)<1e-3)
        break;
    else
        x=y;
    end
end
View Code