一道计算机FORTRAN95的编程题,按泰勒展开求sinx……即当输入值的值,运行输出结果为sinx的值!十万火急!
2个回答
展开全部
subroutine cf(n,a) !计算n!的子程序
integer i,n
a=1
do i=1,n
a=a*i
end do
end subroutine
program main !b为精度,即误差不越过b
integer i,c
real::x,b
read(*,*)x,b
i=1
call cf(i,a) !a为i! 误差判断时用到, 误差=/x/**(n+1)/(n+1)!
if(abs(x)>=1) then !如果X>=1,取的项数越多误差越大,故只取sinx=x,不然不能判别什么时候停止循环,
s=x
else !如果x<1,用泰勒公式近似展开才有意思,
do while((abs(x))**(i+1)/a>=b) 误差=/x/**(n+1)/(n+1)!随着i增加即项数增加,越来越小,所以当误差小于b时即可以停止循环,达到要求精度
i=i+1
call cf(i+1,a)
end do
c=i i因为下面的循环变量有i,所以这里再用一变量c来代替n的最大值i
s=0 !求和sinx=x-x**3/3!+x**5/5!+...+(-1)**(n-1)*(x**(2n-1))/(2n-1)! c即为n的最大值,
do i=1,c,2 ! i每次加2即N每次加2
call cf(i,a)
s=s+(-1)**(i-1)*(x**(2*i-1))/a
end do
endif
write(*,*)s
end program main
试试吧,我试过可以用的,一定要给我点分啊,我可是一下午没有研究我的论文啊,谢谢哦,
祝你好运
integer i,n
a=1
do i=1,n
a=a*i
end do
end subroutine
program main !b为精度,即误差不越过b
integer i,c
real::x,b
read(*,*)x,b
i=1
call cf(i,a) !a为i! 误差判断时用到, 误差=/x/**(n+1)/(n+1)!
if(abs(x)>=1) then !如果X>=1,取的项数越多误差越大,故只取sinx=x,不然不能判别什么时候停止循环,
s=x
else !如果x<1,用泰勒公式近似展开才有意思,
do while((abs(x))**(i+1)/a>=b) 误差=/x/**(n+1)/(n+1)!随着i增加即项数增加,越来越小,所以当误差小于b时即可以停止循环,达到要求精度
i=i+1
call cf(i+1,a)
end do
c=i i因为下面的循环变量有i,所以这里再用一变量c来代替n的最大值i
s=0 !求和sinx=x-x**3/3!+x**5/5!+...+(-1)**(n-1)*(x**(2n-1))/(2n-1)! c即为n的最大值,
do i=1,c,2 ! i每次加2即N每次加2
call cf(i,a)
s=s+(-1)**(i-1)*(x**(2*i-1))/a
end do
endif
write(*,*)s
end program main
试试吧,我试过可以用的,一定要给我点分啊,我可是一下午没有研究我的论文啊,谢谢哦,
祝你好运
展开全部
program main4
real *8 x,f
read(*,*) x
sinx=0.d0
Do 10,i=1,1000
f=real(x**(2*i-1)*((-1)**(i+1)))/(2*i-1)
if( abs(f).gt.1e-6 ) then
sinx=sinx + f
else
goto 20
endif
10 continue
20 write(*,*) sinx,i
end
real *8 x,f
read(*,*) x
sinx=0.d0
Do 10,i=1,1000
f=real(x**(2*i-1)*((-1)**(i+1)))/(2*i-1)
if( abs(f).gt.1e-6 ) then
sinx=sinx + f
else
goto 20
endif
10 continue
20 write(*,*) sinx,i
end
参考资料: FORTRAN语言(谭浩强、田淑清、清华大学出版社)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询