以下所有题目,终止条件为前后两次近似解之差小于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