第一次作业

该博客展示了使用二分法、不动点迭代法和牛顿法解决非线性方程,以及高斯消去法、雅可比迭代和高斯-赛德尔迭代法解线性方程组的过程。对于非线性方程,涉及sin(x)、ln(x)和指数函数的方程被逐一求解。线性方程组部分,通过高斯消去法得到解,并证明了雅可比和高斯-赛德尔迭代在特定情况下不收敛。
摘要由CSDN通过智能技术生成

以下所有题目,终止条件为前后两次近似解之差小于10−3。
1. 用二分法、不动点迭代(与牛顿法不一样)、牛顿法求解以下非线性方程。
(1) sin 𝑥 = 6𝑥 + 5 (2) ln 𝑥 + 𝑥2 = 3 (3) 𝑒^𝑥 + 𝑥 = 7

(1)

clear;
clc;
%二分法
R=0;
L=-1;
root1=R;
root2=L;
f=@(x) sin(x)-6*x-5;    %求给定的函数,可以直接在本行中修改后面代码为其他函数  
while abs(root1-root2)>=0.001    %设定一个求根区域精度,然后进行判断
    root1=root2;
    root2=(R+L)/2;    %当根的区间大于所给精度时,利用二分法重新规划求根区间
    if f(root2)==0    
        break;    %r恰好为所求根,直接跳出循环
    end
    if f(root2)*f(R)<0    %用零点存在定理判断根所在的区域
        L=root2;
    else
        R=root2;
    end
end
root2    %直接输出所求根的值

%不动点迭代法
p=1;
q=(sin(p)-5)/6;
while abs(q-p)>=0.001
    p=q;
    q=(sin(p)-5)/6;
end
q

%牛顿法
x0=0;
x = x0 - f(x0)/(cos(x0)-6);
while abs(x-x0)>= 0.001
    x0 = x;
    x = x0 - f(x0)/(cos(x0)-6);  % 牛顿迭代法式子
end
x
 

(2)

clear;
clc;
%二分法
U=2;
L=1;
root1=U;
root2=L;
f=@(x) log(x)+x^2-3;    %求给定的函数,可以直接在本行中修改后面代码为其他函数  
while abs(root1-root2)>=0.001    %设定一个求根区域精度,然后进行判断
    root1=root2;
    root2=(U+L)/2;    %当根的区间大于所给精度时,利用二分法重新规划求根区间
    if f(root2)==0    
        break;    %r恰好为所求根,直接跳出循环
    end
    if f(root2)*f(U)<0    %用零点存在定理判断根所在的区域
        L=root2;
    else
        U=root2;
    end
end
root2    %直接输出所求根的值

%不动点迭代法
p=1.6;
q=(3-log(p))^(1/2);
while abs(q-p)>=0.001
    p=q;
    q=(3-log(p))^(1/2);  %!!! 1/2一定要加括号!!!
end
q

%牛顿法
x0=1;
x = x0 - f(x0)/(1/x0+2*x0);
while abs(x-x0)>= 0.001
    x0 = x;
    x = x0 - f(x0)/(1/x+2*x);  % 牛顿迭代法式子
end
x

(3)

clear;
clc;

%exp(x)+x=7

%二分法
R=2;
L=1;
root1=R;
root2=L;
f=@(x) exp(x)+x-7;               %求给定的函数,可以直接在本行中修改后面代码为其他函数  
while abs(root1-root2)>=0.001    %设定一个求根区域精度,然后进行判断
    root1=root2;
    root2=(R+L)/2;               %当根的区间大于所给精度时,利用二分法重新规划求根区间
    if f(root2)==0    
        break;                   %恰好为所求根,直接跳出循环
    end
    if f(root2)*f(R)<0           %用零点存在定理判断根所在的区域
        L=root2;
    else
        R=root2;
    end
end
root2                            %直接输出所求根的值

%不动点迭代法
p=1;
q=log(7-p);
while abs(q-p)>=0.001
    p=q;
    q=log(7-p);
end
q

%牛顿法
x0=0;
x = x0 - f(x0)/(exp(x0)+1);
while abs(x-x0)>= 0.001
    x0 = x;
    x = x0 - f(x0)/(exp(x0)+1);   % 牛顿迭代法式子
end
x

 

2. 用高斯消去法、Jacobi 迭代、G-S 迭代求解以下线性方程组。 

(1)

%高斯消去法
clear,clc

A=[2,-2,-1;4,1,-2;-2,1,-1];
b=[-2;1;-3];

matrix=[A,b];   
n=3;

%定义一个1*n的矩阵,下边会用到
for k=1:n                    
    matrix2(1,k)=0;
end

%高斯消元法算法
for j=1:n                              
    for i=(j+1):n
        if(matrix(j,j)~=0)             %除数不为0时,进行各行的计算
           divisor=matrix(i,j)/matrix(j,j);
           matrix(i,:)=matrix(i,:)-matrix(j,:)*divisor;
        else                           %除数为0时,找到当前列中,元素不为0的行数,两者进行交换
            for k=j:n                  %此时用到了上面定义的一行n列的矩阵
                if(matrix(k,j)~=0)     %矩阵行元素进行交换
                    matrix2(1,:)=matrix(j,:);
                    matrix(j,:)=matrix(k,:);
                    matrix(k,:)=matrix2(1,:);
                end
            end
        end
    end
end
matrix;                                %此处无分号,输出最后的矩阵

x=zeros(n,1);
x(n)=matrix(n,n+1)/matrix(n,n);
for i=n-1:-1:1
    x(i)=(matrix(i,n+1)-matrix(i,[i+1:n])*x(i+1:n))/matrix(i,i);
end
x

%经计算发现,该线性方程组的雅可比迭代法和G-S法都不收敛,以下为证明:

D=diag(diag(A));     %求对角矩阵
L=-tril(A,-1);       %求下三角
U=-triu(A,1);        %求上三角
B1=D\(L+U);
B2=(D-L)\U;
R1=max(abs(eig(B1))) %求谱半径 R1=2.1584>1 不收敛
R2=max(abs(eig(B2))) %求谱半径 R2=4>1 不收敛

 

(2)

main.m

clear;
clc;

%n阶矩阵的高斯消去法

%构建有规律的大矩阵
A=zeros(100);
b=zeros(100,1);
for m=1:100
    A(m,m)= 3;
    b(m,1)=1;
end
b(1,1)=2;
b(100,1)=2;
for m=1:99
    A(m,m+1)= -1;
    A(m+1,m)= -1;
end

matrix=[A,b];   
n=100;

%定义一个1*n的矩阵,下边会用到
for k=1:n                    
    matrix2(1,k)=0;
end

%高斯消元法算法
for j=1:n                         
    for i=(j+1):n
        if(matrix(j,j)~=0)             %除数不为0时,进行各行的计算
           divisor=matrix(i,j)/matrix(j,j);
           matrix(i,:)=matrix(i,:)-matrix(j,:)*divisor;
        else                           %除数为0时,找到当前列中,元素不为0的行数,两者进行交换
            for k=j:n                  %此时用到了上面定义的一行n列的矩阵
                if(matrix(k,j)~=0)     %矩阵行元素进行交换
                    matrix2(1,:)=matrix(j,:);
                    matrix(j,:)=matrix(k,:);
                    matrix(k,:)=matrix2(1,:);
                end
            end
        end
    end
end
matrix;                                %此处无分号,输出最后的矩阵

x=zeros(n,1);
x(n)=matrix(n,n+1)/matrix(n,n);
for i=n-1:-1:1
    x(i)=(matrix(i,n+1)-matrix(i,[i+1:n])*x(i+1:n))/matrix(i,i);
end
x

%Jacobi迭代法
C=zeros(1,100);
[y, n1] = jacobi(A,b,C',1.0e-3);
y

%高斯-赛德尔迭代法
[z,n2]= gauseidel(A,b,C',1.0e-3);
z

jacobi.m

function [y,n]=jacobi(A,b,x0,ep)
% 输出的参数 y指方程的解 n为迭代的次数
% 输入的参数分别是系数矩阵 右端列向量 迭代的初值 精度
D=diag(diag(A));     %求对角矩阵
L=-tril(A,-1);       %求下三角
U=-triu(A,1);        %求上三角
B=D\(L+U);
f=D\b;
y=B*x0+f;
n=1;
while norm(y-x0)>=ep %用2范数去逼近
    x0=y;
    y=B*x0+f;
    n=n+1;
end

gauseidel.m

function [y,n]=gauseidel(A,b,x0,ep)
D=diag(diag(A));     %求对角矩阵
L=-tril(A,-1);       %求下三角
U=-triu(A,1);        %求上三角
B=(D-L)\U;
f=(D-L)\b;
y=B*x0+f;
n=1;
while norm(y-x0)>=ep %用2范数去逼近
    x0=y;
    y=B*x0+f;
    n=n+1;
end

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值