第0节 课后习题
0.1 以非线性函数f(x)及其导数f¢(x)和有根区间[a,b]为参数编写二分法、Newton法、简化Newton法和割线法的通用程序。其中Newton法和简化Newton法的迭代初值x0取为有根区间的中点,割线法x0和x1分别取为a、b。误差取ε=10-6。
编程思路:
二分法:
1、c=(a+b)/2;
2、若f(x)=0,则x0=c,程序终止;
3、若f(a) f(c)>0,令a=c,否则令b=c;
4、对新的a、b重复上述三步。
通用程序:
function [x,n,eps1]=solve_x0_dichotomy(f,a,b,x0,N,eps)
% 二分法求根
% f为函数表达式,a为下限,b为上限,N为迭代次数,
% eps为计算误差,x0为迭代的初值
n=1;
eps1=2*eps;
while eps1>eps
if n>N
x=x0;
break;
end
if f(x0)==0
x=x0;
break;
end
if f(a)*f(x0)>0
a=x0;
n=n+1;
else
b=x0;
n=n+1;
end
x0=(a+b)/2;
eps1=abs(x0-a);
x=x0;
end
Newton法:
编程思路:
通用程序:
function [x,n,eps1]=solve_x0_Newton(f,df,x0,N,eps)
% Newton法求根
% f为函数表达式,df为函数的偏导,,x0为迭代的初值
% a为下限,b为上限,N为迭代次数,eps为计算误差
n=1;
eps1=2*eps;
while eps1>eps
if n>N
x=x0;
break;
end
x=x0-f(x0)/df(x0);
eps1=abs(x0-x);
x0=x;
n=n+1;
end
简化Newton法:
编程思路:
通用程序:
function [x,n,eps1]=solve_x0_simple_Newton(f,df,a,b,x0,N,eps)
% 简化Newton法求根
% f为函数表达式,df为函数的偏导,
% a为下限,b为上限,N为迭代次数,eps为计算误差,x0为迭代的初值
n=1;
eps1=2*eps;
while eps1>eps
if n>N
x=x0;
break;
end
x=x0-f(x0)/df((a+b)/2);
eps1=abs(x0-x);
x0=x;
n=n+1;
end
割线法:
编程思路:
通用程序:
function [x,n,eps1]=solve_x0_Secant(f,a,b,x1,x0,N,eps)ac
% 割线法法求根
% f为函数表达式,a为下限,b为上限,N为迭代次数,eps为计算误差
% x0、x1为迭代的两个初值
n=1;
eps1=2*eps;
while eps1>eps
if n>N
x=x0;
break;
end
x=x0-f(x0)/((f(x0)-f(x1))/(x0-x1));
eps1=abs(x0-x);
x1=x0;
x0=x;
n=n+1;
end
0.2 先用作图的办法确定有根区间[a,b],然后应用上题的通用程序求下列方程所示的根。比较几种方法的迭代步数。
1)x=1+0.3 cos x的根;
2)cos x=0.5 + sin x的最小正根;
3)e–x=sin x的最小正根。
编程思想:
和0.1相同。
1)x=1+0.3 cos x的根;
a取-6,b取10,
计算程序:
clear,clc
f=@(x)x-1-0.3*cos(x);
df=@(x)1+0.3*sin(x);
N=200;
a=-6;
b=10;
eps=1e-6;
x0=(a+b)/2;
%二分法
disp('二分法')
[x,n,eps1]=solve_x0_dichotomy(f,a,b,x0,N,eps)
%Newton法
disp('Newton法')
[x,n,eps1]=solve_x0_Newton(f,df,x0,N,eps)
%简化Newton法
disp('简化Newton法')
[x,n,eps1]=solve_x0_simple_Newton(f,df,a,b,x0,N,eps)
%割线法
disp('割线法')
x0=a;
x1=b;
[x,n,eps1]=solve_x0_Secant(f,a,b,x0,x1,N,eps)
计算结果:x=1.1284
计算方法 |
二分法 |
Newton法 |
简化Newton法 |
割线法 |
迭代步数 |
24 |
5 |
5 |
6 |
2)cos x=0.5 + sin x的最小正根;
a取0,b取1,
计算程序:
clear,clc
f=@(x)cos(x)-0.5-sin(x);
df=@(x)-sin(x)-cos(x);
N=200;
a=0;
b=1;
eps=1e-6;
x0=(a+b)/2;
%二分法
disp('二分法')
[x,n,eps1]=solve_x0_dichotomy(f,a,b,x0,N,eps)
%Newton法
disp('Newton法')
[x,n,eps1]=solve_x0_Newton(f,df,x0,N,eps)
%简化Newton法
disp('简化Newton法')
[x,n,eps1]=solve_x0_simple_Newton(f,df,a,b,x0,N,eps)
%割线法
disp('割线法')
x0=a;
x1=b;
[x,n,eps1]=solve_x0_Secant(f,a,b,x0,x1,N,eps)
计算结果:x=0.4240
计算方法 |
二分法 |
Newton法 |
简化Newton法 |
割线法 |
迭代步数 |
20 |
4 |
5 |
6 |
3)e–x=sin x的最小正根。
a取0,b取1,
计算程序:
clear,clc
f=@(x)exp(-x)-sin(x);
df=@(x)-exp(-x)-cos(x);
N=200;
a=0;
b=1;
eps=1e-6;
x0=(a+b)/2;
%二分法
disp('二分法')
[x,n,eps1]=solve_x0_dichotomy(f,a,b,x0,N,eps)
%Newton法
disp('Newton法')
[x,n,eps1]=solve_x0_Newton(f,df,x0,N,eps)
%简化Newton法
disp('简化Newton法')
[x,n,eps1]=solve_x0_simple_Newton(f,df,a,b,x0,N,eps)
%割线法
disp('割线法')
x0=a;
x1=b;
[x,n,eps1]=solve_x0_Secant(f,a,b,x0,x1,N,eps)
计算结果:x=0.5885
计算方法 |
二分法 |
Newton法 |
简化Newton法 |
割线法 |
迭代步数 |
20 |
5 |
6 |
7 |
0.3 利用你教学号的后三位为小数点后三位构造区间[5,6]内的数a。令f(x)=x3–a,
其中
取初值x0=2,误差取ε=10-6,分别用Newton法和迭代格式
求解,比较二者的收敛速度。
计算程序:
clear,clc
a0=5.504;
f=@(x)x.^3-a0;
df=@(x)3*x.^2;
p=@(x)1./(3*x.^2);
q=@(x)0.5*6*x./(3*x.^2).^3;
N=200;
eps=1e-6;
x0=2;
[x,n,eps1]=solve_x0_Newton(f,df,x0,N,eps)
eps1=2*eps;
n=1;
while eps1>eps
if n>N
x=x0;
break;
end
x=x0-p(x0)*f(x0)-q(x0)*f(x0)^2;
eps1=abs(x0-x);
x0=x;
n=n+1;
end
x
n
eps1
计算结果:
=1.7656;Newton法的迭代步数为5,迭代法的迭代步数为4.
0-4 用含秦久韶法的Newton法计算多项式
在x0=6.3附近的根。
编程思想:
利用秦久韶算法求解多项式方程的Newton法
令b-1=c-1=0,对于k=0,1,2,…,
其中a为多项式的系数。
计算程序:
函数文件:
function [xk,n,eps1]=solve_x0_qin_Newton(a,xk,N,eps)
% 秦久韶Newton法求根
% xk为初值,N为迭代次数,eps为计算误差,a为次数
N1=length(a);
n=1;
eps1=2*eps;
while eps1>eps
if n>N
xk=xk;
break;
end
b(1)=0;
c(1)=0;
for nn=2:N1+1
b(nn)=a(nn-1)+xk*b(nn-1);
c(nn)=b(nn)+xk*c(nn-1);
end
xk1=xk-b(end)/c(end-1);
eps1=abs(xk1-xk);
xk=xk1;
n=n+1;
end
主文件:
clear,clc
N=200;
a=[1,-9,26,-34,21,-5];
eps=1e-7;
x0=6.3;
[x,n,eps1]=solve_x0_qin_Newton(a,x0,N,eps)
f=@(x)x.^5-9*x.^4+26*x.^3-34*x.^2+21*x-5;
f(x)
计算结果为x=5,迭代次数为n=8。