计算机.docx

上传人:b****2 文档编号:2235080 上传时间:2022-10-28 格式:DOCX 页数:15 大小:162.40KB
下载 相关 举报
计算机.docx_第1页
第1页 / 共15页
计算机.docx_第2页
第2页 / 共15页
计算机.docx_第3页
第3页 / 共15页
计算机.docx_第4页
第4页 / 共15页
计算机.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

计算机.docx

《计算机.docx》由会员分享,可在线阅读,更多相关《计算机.docx(15页珍藏版)》请在冰豆网上搜索。

计算机.docx

计算机

《MATLAB程序设计实践》课程考核

班级:

材料0808

学号:

0604080805

姓名:

韩勇军

1、编程实现以下科学计算算法,并举一例应用之。

(参考书籍《精通MALAB科学计算》,王正林等著,电子工业出版社,2009年)

“切比雪夫逼近”

算法说明:

当一个连续函数定义在区间[-1,1]上时,它可以展开成切比雪夫级数。

即:

其中为次切比雪夫多项式,具体表达可通过递推得出:

它们之间满足如下的正交关系:

在实际应用中,可根据所需的精度来截取有限的项数,切比雪夫级数中的系数由下式决定:

在MATLAB中编程实现的切比雪夫逼近法函数为:

Chebyshev。

功能:

用切比雪夫多项式逼近已知函数。

调用格式:

其中,y为已知函数;

k为逼近已知函数所需项数;

f是求得的切比雪夫逼近多项式在x0处的逼近值。

程序源代码(m文件):

functionf=Chebyshev(y,k,x0)

%用切比雪夫多项式逼近已知函数

%已知函数:

y

%逼近已知函数所需项数:

k

%逼近点的x坐标:

x0

%求得的切比雪夫逼近多项式或在x0处的逼近值:

f

symst;

T(1:

k+1)=t;

T

(1)=sym('1');

T

(2)=t;

c(1:

k+1)=sym('0');

c

(1)=int(subs(y,findsym(sym(y)),sym('t'))*T

(1)/sqrt(1-t^2),t,-1,1)/pi;

c

(2)=2*int(subs(y,findsym(sym(y)),sym('t'))*T

(2)/sqrt(1-t^2),t,-1,1)/pi;

f=c

(1)+c

(2)*t;

fori=3:

k+1

T(i)=2*t*T(i-1)-T(i-2);

c(i)=2*int(subs(y,findsym(sym(y)),sym('t'))*T(i)/sqrt(1-t^2),t,-1,1)/2;

f=f+c(i)*T(i);

f=vpa(f,6);

if(i==k+1)

if(nargin==3)

f=subs(f,'t',x0);

else

f=vpa(f,6);

end

end

end

 

应用实例:

切比雪夫应用实例。

用切比雪夫公式(取6项)逼近函数,并求当x=0.5时的函数值。

解:

利用程序求解方程,在MATLAB命令窗口中输入:

>>Chebyshev('1/(2-x)',6)%调用创建的函数euler,输出切比雪夫多项式的6个项

再在MATLAB命令窗口中输入:

>>Chebyshev('1/(2-x)',6,0.5)%调用创建的函数euler,输出当x=0.5时的函数值

 

输出结果:

 

流程图:

 

 

 

2、编程解决以下科学计算问题。

实验2:

用二分法(程序3.1)和Newton迭代法(程序3.2)求下列方程的正根:

(1)二分法:

erfen.m:

functiony=erfen(fun,a,b,esp)

ifnargin<4esp=1e-4;end

iffeval(fun,a)*feval(fun,b)<0

n=1;

c=(a+b)/2;

whilec>esp

iffeval(fun,a)*feval(fun,c)<0

b=c;c=(a+b)/2;

elseiffeval(fun,c)*feval(fun,b)<0

a=c;c=(a+b)/2;

elsey=c;esp=10000;

end

n=n+1;

end

y=c;

elseiffeval(fun,a)==0

y=a

elseiffeval(fun,b)==0

y=b;

elsedisp('these,maynotbearootintheintercal');

end

n

函数文件:

fc.m

functiony=fc(x)

y=x*log(sqrt(x.^2-1)+x)-sqrt(x.^2-1)-0.5*x;

end

在MATLAB命令框中输入:

>>clear

>>erfen('fc',1,10,0.05)

输出结果:

(2)牛顿迭代法:

newton.m

functiony=newton(x0)

x1=x0-fc(x0)/df(x0);

n=1;

while(abs(x1-x0)>=1.0e-6)&(n<=100000000)

x0=x1;

x1=x0-fc(x0)/df(x0);n=n+1;

end

x1

n

函数文件:

fc.m

functiony=fc(x)

y=x*log(sqrt(x.^2-1)+x)-sqrt(x.^2-1)-0.5*x;

end

导数函数文件:

df.m

functiony=df(x)

y=log(x+(x^2-1)^(1/2))-x/(x^2-1)^(1/2)+(x*(x/(x^2-1)^(1/2)+1))/(x+(x^2-1)^(1/2))-1/2;

end

在MATLAB命令框中输入:

>>clear

>>clc

>>newton(3)

输出结果:

对比二分法和牛顿法可知:

newton法n值较小,收敛得要快一些。

实验3:

已知函数f(x)=x4-2x在(-2,2)内有两个根,作图求取初值。

用MATAB命令求这两个根。

源代码:

erfen2.m:

functiony=erfen2(fun,a,b,n)

formatlong

ifnargin<4

n=10000;

end

if(b

disp('初始值错误!

')

y=NaN;

return;

end;

if(feval(fun,a)*feval(fun,b)<0)

c=a/2+b/2;

while(n>0)

iffeval(fun,a)*feval(fun,c)<0

b=c;c=a/2+b/2;

elseiffeval(fun,b)*feval(fun,c)<0

a=c;c=a/2+b/2;

else

y=c;n=0;

end

n=n-1;

end

y=c;

elseiffeval(fun,a)==0

y=a;

elseiffeval(fun,b)==0;

y=b;

else

disp('取值范围内可能不存在解!

')

end

函数文件:

f2.m

functiony=f2(x)

y=x^4-2^x;

end

在MATLAB命令框中输入:

>>fplot('f2',[-2,2])

>>

得到函数图形:

从图形上可以看出f(-2),f

(2)的值均大于0,而f(0)的值为小于。

下面对其进行验证:

在命令框中分别输入:

>>y=f2

(2)

>>

>>y=f2(-2)

>>

>>y=f2(0)

>>

得出的结果为:

该结果验证了上述猜想:

故易知函数的两个解分别位于区间[-2,0],[0,2]中。

下面为具体的求解过程并分析误差大小:

在MATLAB命令框中输入:

>>x=erfen2('f2',-2,0)

x=

-0.861345332309651

>>tol=f2(x)

tol=

2.220446049250313e-016

>>x=erfen2('f2',0,2)

x=

1.239627729522762

>>tol=f2(x)

tol=

8.881784197001252e-016

输出结果:

 

 

在MATLAB中实现切比雪夫逼近的代码如下:

M文件:

程序:

r=Secant('log(x)+sqrt(x)-2',1,4)

运行结果:

r=

1.8773

1、编程解决以下科学计算问题

计算积分

1

程序:

>>symsx

>>int(exp(-x.^2)./(1+x.^2),-inf,+inf)

ans=

pi*erfc

(1)*exp

(1)

M文件:

functiony=fun(x)

y=tan(x)./x.^(0.7);

程序:

quad('fun',0,1)

结果:

ans=

0.9063

M文件:

functiony=fun1(x)

y=exp(x)./(1+x.^2).^0.5;

程序:

quad('fun1',0,1)

结果:

ans=

1.4690

程序及结果:

symsxy

>>int(1+x+y.^2,y,-sqrt(1-(x-1).^2),sqrt(1-(x-1).^2))

ans=

(2*(1-(x-1)^2)^(1/2)*(3*x-(x-1)^2+4))/3

>>int((2*(1-(x-1)^2)^(1/2)*(3*x-(x-1)^2+4))/3,x,-1,1)

ans=

pi/2+(5*asin

(2))/4+(3*3^(1/2)*i)/2-2/3+log(2-3^(1/2))*i

编制一个变步长梯行程序,解例题5.14比较与Romberg积分法的计算量

例5.14用Romberg积分公式计算积分I=时,要求结果误差为0.5×10。

变步长梯行法:

M文件:

function[I,step]=BBC(f,a,b,eps)

if(nargin==3)

eps=0.5e-5;

end;

n=1;

h=(b-a);

I2=(subs(sym(f),findsym(sym(f)),a)+subs(sym(f),findsym(sym(f)),b))*h/2;

Tol=1;

whileTol>eps

n=n+1;

h=h./2;

I1=I2;

I2=0;

fori=0:

(2^n-1)

x=a+h.*i;

x1=x+h;

I2=I2+(h./2).*(subs(sym(f),findsym(sym(f)),x)+subs(sym(f),findsym(sym(f)),x1));

end

Tol=abs(I2-I1);

end

I=I2;

step=n;

Romberg积分法:

M文件:

function[I,step]=Roberg(f,a,b,eps)

if(nargin==3)

eps=0.5e-5

end;

symsf

M=1;

tol=10;

k=0;

T=zeros(1,1);

h=b-a;

T(1,1)=(h/2).*(subs(f,findsym(f),a)+subs(f,findsym(f),b));

whiletol>eps

k=k+1;

h=h/2;

Q=0;

fori=1:

M

x=a+h*(2*i-1);

Q=Q+subs(f,findsym(f),x);

end

T(k+1,1)=T(k,1)/2+h*Q;

M=M*2;

forj=1:

k

T(k+1,j+1)=T(k+1,j)+(T(k+1,j)-T(k,j))/(4^j-1);

end

tol=abs(T(k+1,j+1)-T(k,j));

end

I=T(k+1,k+1);

step=k;

程序:

[q,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 商业计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1