急,跪求答案,fortran编的程序运行中出现了 run-time error m6103:math-floating-piont error的错误
题目是实现里米兹(remez)方法求函数的最佳逼近多项式运行的时候出现了run-timeerrorm6103:math-floating-pionterror:divid...
题目是实现里米兹(remez)方法求函数的最佳逼近多项式
运行的时候出现了 run-time error m6103:math-floating-piont error:divide by zero 的错误,怎么解决啊。谢谢
这是我的程序
real(8) a,b,c,d,d1,d2
integer n,k,l
parameter(PI=3.141593)
real(8),dimension(:),allocatable::g,x
allocate(g(n))
allocate(x(n))
print*,"请输入a,b,n的值,注意a应该小于b,n为整数"
read(*,*) a,b,n
if(b<a) print*,"输入有误,请重新输入"
k=n+1
do l=1,k
x(k)=0.5*(b+a+(b-a)*cos((n-k+1)/n*PI))
end do
call u(c,d,k,x)
d1=c/d
call y(a,b,k,x,g)
call u(c,d,k,x)
d2=c/d
call y(a,b,k,x,g)
do while(abs(d1-d2)>1.0E-8)
call u(c,d,k,x)
d1=c/d
call y(a,b,k,x,g)
call u(c,d,k,x)
d2=c/d
call y(a,b,k,x,g)
end do
do l=1,n
print*,g(l)
end do
end
function f(x)
real(8) x
f=cos(x)
end
subroutine CX1(p,x,n,h,v)
integer n,l,j
real(8) h(n-1),v(n-1),p,c,d,x
real(8),dimension(:),allocatable::s
do l=1,n
allocate(s(l))
do j=1,l
s(j)=h(j)
end do
call u(c,d,l,s)
v(l)=c
end do
do l=2,n-1
p=v(l)*x**(l-1)
end do
p=v(1)+p
end
subroutine u(c,d,n,h)
real(8) t,c,d,w,h(n),i(n),q(n)
integer n,l,k
do l=1,n
i(l)=1.0*f(h(l))
end do
w=1
do k=1,n
do l=1,n
if(l/=k) then
t=h(k)-h(l)
w=w*t
end if
end do
i(k)=i(k)/w
q(k)=(-1.0)**(k+1)/w
d=d+q(k)
c=c+i(k)
end do
end
subroutine y(a,b,n,h,g)
integer o
real(8) i,max,m,p,a,b,h(n),g(n)
max=0
do i=a,b,1.0E-9
call CX1(p,i,n,h,g)
if(abs(p-f(i))>abs(max)) then
max=p-f(i)
m=i
end if
end do
call CX1(p,h(1),n,h,g)
if(n>a.and.n<h(1)) then
if(max*(p-f(h(1)))>0)then
h(1)=m
else
do o=n,1,-1
h(o)=h(o-1)
end do
h(1)=m
end if
end if
call CX1(p,h(n),n,h,g)
if(n>h(n).and.n<b)then
if(max*(p-f(h(n)))>0) then
h(n)=m
else
do o=1,n
h(o)=h(o+1)
end do
end if
h(n)=m
end if
do o=1,n
call CX1(p,h(o),n,h,g)
if(m>h(o).and.m<h(o+1).or.m>h(o+1).and.m<h(o)) then
if((p-f(h(o)))*max>0) h(o)=m
if((p-f(h(o)))*max<0) h(o+1)=m
end if
end do
end 展开
运行的时候出现了 run-time error m6103:math-floating-piont error:divide by zero 的错误,怎么解决啊。谢谢
这是我的程序
real(8) a,b,c,d,d1,d2
integer n,k,l
parameter(PI=3.141593)
real(8),dimension(:),allocatable::g,x
allocate(g(n))
allocate(x(n))
print*,"请输入a,b,n的值,注意a应该小于b,n为整数"
read(*,*) a,b,n
if(b<a) print*,"输入有误,请重新输入"
k=n+1
do l=1,k
x(k)=0.5*(b+a+(b-a)*cos((n-k+1)/n*PI))
end do
call u(c,d,k,x)
d1=c/d
call y(a,b,k,x,g)
call u(c,d,k,x)
d2=c/d
call y(a,b,k,x,g)
do while(abs(d1-d2)>1.0E-8)
call u(c,d,k,x)
d1=c/d
call y(a,b,k,x,g)
call u(c,d,k,x)
d2=c/d
call y(a,b,k,x,g)
end do
do l=1,n
print*,g(l)
end do
end
function f(x)
real(8) x
f=cos(x)
end
subroutine CX1(p,x,n,h,v)
integer n,l,j
real(8) h(n-1),v(n-1),p,c,d,x
real(8),dimension(:),allocatable::s
do l=1,n
allocate(s(l))
do j=1,l
s(j)=h(j)
end do
call u(c,d,l,s)
v(l)=c
end do
do l=2,n-1
p=v(l)*x**(l-1)
end do
p=v(1)+p
end
subroutine u(c,d,n,h)
real(8) t,c,d,w,h(n),i(n),q(n)
integer n,l,k
do l=1,n
i(l)=1.0*f(h(l))
end do
w=1
do k=1,n
do l=1,n
if(l/=k) then
t=h(k)-h(l)
w=w*t
end if
end do
i(k)=i(k)/w
q(k)=(-1.0)**(k+1)/w
d=d+q(k)
c=c+i(k)
end do
end
subroutine y(a,b,n,h,g)
integer o
real(8) i,max,m,p,a,b,h(n),g(n)
max=0
do i=a,b,1.0E-9
call CX1(p,i,n,h,g)
if(abs(p-f(i))>abs(max)) then
max=p-f(i)
m=i
end if
end do
call CX1(p,h(1),n,h,g)
if(n>a.and.n<h(1)) then
if(max*(p-f(h(1)))>0)then
h(1)=m
else
do o=n,1,-1
h(o)=h(o-1)
end do
h(1)=m
end if
end if
call CX1(p,h(n),n,h,g)
if(n>h(n).and.n<b)then
if(max*(p-f(h(n)))>0) then
h(n)=m
else
do o=1,n
h(o)=h(o+1)
end do
end if
h(n)=m
end if
do o=1,n
call CX1(p,h(o),n,h,g)
if(m>h(o).and.m<h(o+1).or.m>h(o+1).and.m<h(o)) then
if((p-f(h(o)))*max>0) h(o)=m
if((p-f(h(o)))*max<0) h(o+1)=m
end if
end do
end 展开
1个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询