牛顿法、割线法、二分法
1 clear;clc; 2 %% 牛顿法 3 f=@(x)x^4-4*x^2+4;%函数 4 df=@(x)4*x^3-8*x;%一阶导数 5 ddf=@(x)12*x^2-8;%二阶导数 6 N=1000;%最大迭代次数 7 x=zeros(N,1);%储存迭代点 8 x(1)=log(8);%初始点 9 eps=0.00001;%容许误差 10 11 %迭代过程 12 for k=2:1:N 13 x(k)=x(k-1)-f(x(k-1))/df(x(k-1)); 14 if(abs(x(k)-x(k-1))<eps) 15 break; 16 end 17 end 18 19 X=x(k);%迭代结果 20 K=k;%迭代步数 21 22 %% 牛顿法修正1 23 x=zeros(N,1);%储存迭代点 24 x(1)=log(8);%初始点 25 26 %迭代过程 27 for k=2:1:N 28 x(k)=x(k-1)-2*f(x(k-1))/df(x(k-1)); 29 if(abs(x(k)-x(k-1))<eps) 30 break; 31 end 32 end 33 34 X1=x(k);%迭代结果 35 K1=k;%迭代步数 36 37 %% 牛顿法修正2 38 x=zeros(N,1);%储存迭代点 39 x(1)=log(8);%初始点 40 41 %迭代过程 42 for k=2:1:N 43 x(k)=x(k-1)-f(x(k-1))*df(x(k-1))/(df(x(k-1))^2-ddf(x(k-1))*f(x(k-1))); 44 if(abs(x(k)-x(k-1))<eps) 45 break; 46 end 47 end 48 49 X2=x(k);%迭代结果 50 K2=k;%迭代步数
1 clear;clc; 2 %% 割线法 3 f=@(x)x^4-4*x^2+4;%函数 4 df=@(x)4*x^3-8*x;%一阶导数 5 N=1000;%最大迭代次数 6 x=zeros(N,1);%储存迭代点 7 x(1)=log(8);%初始点 8 x(2)=x(1)-f(x(1))/df(x(1)); 9 eps=0.00001;%容许误差 10 11 %迭代过程 12 for k=3:1:N 13 x(k)=x(k-1)-(x(k-1)-x(k-2))/(f(x(k-1))-f(x(k-2)))*f(x(k-1)); 14 if(abs(x(k)-x(k-1))<eps) 15 break; 16 end 17 end 18 19 X=x(k);%迭代结果 20 K=k;%迭代步数 21 22 %% 修正的割线法 23 x=zeros(N,1);%储存迭代点 24 x(1)=log(8);%初始点 25 x(2)=x(1)-f(x(1))/df(x(1)); 26 27 %迭代过程 28 for k=3:1:N 29 u=x(k-2);v=x(k-1);s=u; 30 if abs(u)<abs(v)%交换 31 s=v; 32 v=u; 33 u=s; 34 end 35 x(k)=v-(v-u)/(f(v)-f(u))*f(v); 36 if(abs(x(k)-x(k-1))<eps) 37 break; 38 end 39 end 40 41 X1=x(k);%迭代结果 42 K1=k;%迭代步数
1 clear;clc; 2 %% 二分法 3 %计算根号三,相当于计算方程"x^2-3=0"的正根 4 f=@(x)x^2-3; 5 a=0;b=100;%区间端点 6 c=(a+b)/2; 7 N=1000;%最大迭代次数 8 eps=0.00001;%容许误差 9 10 % 二分法过程 11 for k=1:1:N 12 if(f(a)*f(c)<0) 13 b=c; 14 c=(a+b)/2; 15 else 16 a=c; 17 c=(a+b)/2; 18 end 19 if (abs(a-b)<eps) 20 break; 21 end 22 end 23 24 X=c;%迭代结果 25 K=k;%迭代步数
另外,今天上机课写程序时,发现不同的起始点可以收敛到不同的零点。也许这是一个新的值得研究的地方。
看来,计算数学也是这样,光听理论无法实现大的突破,也没法产生好的想法,必须在实践应用中感受方法的过程,才能发现新的突破点。
本文来自博客园,作者:来者可追2019,转载请注明原文链接:https://www.cnblogs.com/wjma2719/p/17866881.html