数学实验第三版(主编:李继成 赵小艳)课后练习答案(八)(2)

实验八:近似计算

练习二

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. 用不同的方法计算下列积分的近似值:

(1)

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)

(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)_第1张图片

则当时,.由此计算π并与(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位。你能从理论上推算出这个公式吗?

提示:

(n重根号),注意

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 )法计算这个冰淇淋的体积。

数学实验第三版(主编:李继成 赵小艳)课后练习答案(八)(2)_第2张图片

​
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. 自己想想,还有哪些数学问题可以用取随机数的方法来模拟计算?至少举出三例,并进行类似的数值模拟实验。

本文由作者自创,由于时间原因,难免出现些许错误,还请大家多多指正。创作不易,请大家多多支持。

你可能感兴趣的:(matlab)