1. 用MATLAB 软件完成下面的实验任务:
(1)求函数y=ln(1+x)和 在x=0处的泰勒展开式;用这两个泰勒展开式分别计算ln2的近似值,在精度要求为
的情况下,哪一个较好?
clc;clear;
log(2)
y=@(x)log(x+1);
y0=sym(y);
for i=9400:9500
y1=matlabFunction(taylor(y0,'order',i));
if fix(y1(1)*10000)==6931
i
return;
end
end
这个程序运行不出来结果,但经过我的一一尝试,最终在i取9468时pi才精确到小数点后四位。
同样我们再将y1换为log((1+x)/(1-x)),当i等于8时,即可精确至小数点后四位。
则显而易见,后者的收敛速度更快,效果更好。
(2)求出函数y=ln(1+x)在x=2处的泰勒展开式,计算ln2的近似值,与(1)比较,哪一种更好?
clc;clear;
log(2)
y=@(x)log(x+1);
syms x
y0=y(x);
y2=taylor(y0,x,2,'order',8)
y1=matlabFunction(y2);
y1(1)
经过实验得知,当在x=2处泰勒展开后,i仅取到8即可精确到小数点后四位。与(1)相比,这种更好,其次是第一问的后者,最后是在x=0泰勒展开。原因为此函数简单且收敛速度快。
(3)请再找出3种以上计算ln2近似值的方法,相互比较,哪一个更好?
clc;clear;
log(2)
%方法一:近似函数
y=@(x)sqrt(x)-1/sqrt(x);
y(2)
%方法二:帕德逼近
y1=@(x)(3*x^2-3)/(6*x^2-11*x+11);
y1(2)
%方法三:积分
y2=@(x)log(x);
x0=1:0.01:2;jifen=0;
for k=1:100
jifen=jifen+(y2(x0(k))+y2(x0(k+1)))/2*0.01;
end
(jifen+1)/2
ln(2)=0.693147180559945
方法一(近似函数)=0.707106781186548
方法二(帕德逼近)=0.692307692307692
方法三(积分)=0.693145097238764
2. 用不同的方法计算下列积分的近似值:
clc;clear;
%方法一:梯形数值积分
y=@(x)1/sqrt(1+x^4);
x=0:0.01:1;jf1=0;
for i=1:100
jf1=jf1+(y(x(i))+y(x(i+1)))/2*0.01;
end
jf1
%方法二:矩形数值积分(中)
jf1=0;
for i=1:100
jf1=jf1+y((x(i)+x(i+1))/2)*0.01;
end
jf1
%方法三:近似函数替代
syms x
y11=y(x);
y22=taylor(y11,x,0.5,'order',20);
jf1=int(y22,0,1);
double(jf1)
jf1 =0.927031446035248
jf1 =0.927040284980503
jf1 =0.927036166084731
(2)(3)方法同上,只需把函数换了就可以。
3.用下面几种方法计算π的近似值:
(1)设序列,可以证明
,取n=1,2,⋯,50000
,计算
,即π的近似值。
clc;clear;
f=@(k)(-1)^(k-1)/(2*k-1);
syms k
y=f(k);
x=[1,2,5,10,50,500,1000,5000,50000];
for i=1:length(x)
m=symsum(y,k,1,x(i));
double(4*m)
end
ans = 4
ans =2.666666666666667
ans =3.339682539682540
ans =3.041839618929402
ans =3.121594652591011
ans =3.139592655589783
ans =3.140592653839793
ans =3.141392653591793
ans =3.141572653589795
(2)用BBP公式
计算π的近似值。
clc;clear;
format long
f=@(n)1/16^n*(4/(8*n+1)-2/(8*n+4)-1/(8*n+5)-1/(8*n+6));
syms n
y=f(n);
double(symsum(y,n,0,1000))
ans =3.141592653589793
(3)取 ,定义
则当时,
.由此计算π并与(2)比较。
clear;
a0=sqrt(2);b0=0;p0=2+sqrt(2);
for n=1:5
a1=1/2*(sqrt(a0)+1/sqrt(a0));
b1=sqrt(a0)*(1+b0)/(a0+b0);
p1=p0*b1*(1+a1)/(1+b1);
a0=a1;
b0=b1;
p0=p1;
end
p0
此迭代收敛速度非常之快,仅仅迭代五次,就已经精确到了15位,相比之前几个估计方法,此法最优。
4)设,定义
则当时,
.由此计算π,并和(2)(3)比较,那个收敛的更快一些呢?
clear;clc;
a0=6-4*sqrt(2);
b0=sqrt(2)-1;
for n=0:1
b1=(1-(1-b0^4)^0.25)/(1+(1-b0^4)^0.25);
a1=a0*(1+b1)^4-2^(2*n+3)*b1*(1+b1+b1^2);
a0=a1;b0=b1;
end
double(1/a0)
我们看到仅仅是迭代了2次,结果直接就出来了,简直是不可思议。
不用说了,我现在认为这个比上个还要好(收敛更快),哈哈。
(5)利用韦达(Vieta )公式
计算π的近似值,要求精确至小数后的第8位。你能从理论上推算出这个公式吗?
提示:
clear;clc;m=0;k=1;
for i=1:100
m=sqrt(2+m);
k=k/2*m;
if fix(1/k*2*10^8)==314159265
i %判断精确到第八位时i的值
1/k*2
return;
end
end
i=15;ans=3.141592652386591;
(6) 你自己还能设计出哪些计算圆周率π近似值的方法?
设计姑且就算了,我就借鉴一下前人之果吧。
clc;clear;
%拉马努金公式
f=@(k)factorial(4*k)/(factorial(k)^4)*(26390*k+1103)/396^(4*k);%阶乘
syms k
y=f(k);
m=2*sqrt(2)/99^2*symsum(y,k,0,2);%级数求和
double(1/m)
3.141592653589793
4. 尝试用圆外切正多边形与圆内接正多边形的方法计算圆周率π的近似值.
clc;clear;
n=[100,200,300,500,1000,5000];%这里可以更改n值
for i=1:length(n)
inner=2*sin(pi/n(i))*n(i);
outer=2*tan(pi/n(i))*n(i);
fprintf('pi属于(%.15f,%.15f)\n',inner/2,outer/2);
end
pi属于(3.141075907812829,3.142626604335115)
pi属于(3.141463462364135,3.141851064732983)
pi属于(3.141535234873738,3.141707496689156)
pi属于(3.141571982779475,3.141633995944886)
pi属于(3.141587485879564,3.141602989056156)
pi属于(3.141592446881286,3.141593067006881)
5. 设有一制作均匀的冰淇淋可以看成由圆锥面 和球面
围成,用蒙特卡罗(Monte Carlo )法计算这个冰淇淋的体积。
clc;clear;
x=-1:0.01:1;
[x,y]=meshgrid(x,x);
x(find(1-x.^2-y.^2<0))=nan;
z=sqrt(1-x.^2-y.^2)+1;
mesh(x,y,z);
z1=sqrt(x.^2+y.^2);
hold on
mesh(x,y,z1);
axis off
%这个是上边图形的代码
clc;clear;
x=rand(1,50000)*2-1;
y=rand(1,50000)*2-1;
z=rand(1,50000)*2;
sum=0;
for i=1:50000
if z(i)>1
if x(i)^2+y(i)^2+(z(i)-1)^2<=1
sum=sum+1;
end
else
if sqrt(x(i)^2+y(i)^2)<=z(i)
sum=sum+1;
end
end
end
sum/50000*8
3.164640000000000(随机的)接近于π。
6. 自己想想,还有哪些数学问题可以用取随机数的方法来模拟计算?至少举出三例,并进行类似的数值模拟实验。
略
本文由作者自创,由于时间原因,难免出现些许错误,还请大家多多指正。创作不易,请大家多多支持。