Fortran学习20:数值计算方法3

今天来看看微积分,什么是微积分,好多人会给出自己的理解,我的理解就是,一个非规则几何体、面,太难算了,就把他给分,分成足够多的小块,然后就发现,每一个小块的面积相加就是整体的面积,分的过程就是微分,相加的过程就是积分。

用数值方法来积分的时候,主要是应用在函数不存在的时候,我们从实验中得到的一连串数据,没有办法刚好使用一些已知的函数来表示,那么这个时候就用其他的算法来计算了。

1、梯形法求积分:

这个是最简单的,使用梯形法,把所需要积分的图形,用许多的小梯形方块填满,这样就近似求解了。

module integeral
    implicit none
    real,PARAMETER::PI=3.1415926
    contains
        subroutine GenerateData(datas,width,func)
            ! 生成数列
            real datas(:),width
            real,external::func
            real r
            integer i,n
            n=size(datas, dim=1)
            width=PI/(n-1)
            r=0
            do i=1,n
                datas(i)=func(r)
                r=r+width
            end do     
        end subroutine
        real function Trape_Integral(datas,width)
            implicit none
            real datas(:)
            real::width,sum
            ! sum:计算所有上底加下底除以2的和
            integer i,n
            n=size(datas, dim=1)
            sum=(datas(1)+datas(n))/2.0
            !(上底加下底)/2
            do i=2,n-1
                sum=sum+datas(i)
                ! 累加边长
            end do 
            Trape_Integral=sum*width
            ! 计算面积和
            return 
        end function
end module
program main
    use integeral
    implicit none
    integer,PARAMETER::n=10
    real::datas(n),width
    real ans
    real,intrinsic::sin
    ! 仿真用来生成数据的函数
    CALL GenerateData(datas,width,sin)
    ans= Trape_Integral(datas,width)
    write(*,"('ans=',F4.2)")ans
    stop "over"
    end program

program main中的n是精度,n越大,拟合的效果就越好 

上面是n=10的情况,再看看n=10000:

 n在这里就是微分的精度,微分的精度越高,拟合的效果就越好

辛普森法求积分:

辛普森法的原理就是把函数图像用很多段的二次曲线来近似图形,在计算这些二次曲线所形成的面积,但是使用辛普森法有个条件:必须要是奇数个数据才能够计算,因为每一条二次曲线都要从数据中取三个点,每一条二次曲线的积分公式:

\int f(x)dx=(f_{0}+4*f_{1}+f_{2})*h/3

把每一段二次曲线累加起来,就可以得到整个辛普森法积分的公式:

\int f(x)dx=(f_{0}+4*f_{1}+2*f_{2}+4*f_{3}+2*f_{4}+...+4*f_{n-1}+2*f_{n})*h/3

上代码:

        real function Simpson(datas,width)
            implicit none
            real datas(:),width
            real sum
            integer i,n
            n=size(datas, dim=1)
            if(mod(n,2)==0)then
                write(*,*)"you must enter an odd number"
            stop "error number"
            end if
            sum=datas(1)+datas(n)
            ! 先算出头尾的和
            do i=2,n-1
                if(mod(i,2)==0)then
                    sum=sum+4*datas(i)
                else
                    sum=sum+2*datas(i)
                end if
            end do 
            Simpson=sum*width/3.0
            RETURN
        end function 

把这一段加到上面的module里面,直接调用就行,就是在调用的时候,program main中的n必须是奇数,否则会在第七行报错。

上述两种方法算的数值一一模一样的,就不贴代码了。

这里介绍三种Fortran计算时间的办法:

1、cpu_time()

real::time_start,time_end,time
call cpu_time(time_start)
......
call cpu_time(time_end)
time=time_start-time_end

这个只用于单线程,而且数值必须要是real,如果使用在多线程中,Fortran并不会报错,他输出的实际是所有线程的时间和

2、DATE_AND_TIME(dat1,dat2)

CHARACTER(len=20)::dat1,dat2
CALL DATE_AND_TIME(dat1,dat2)

输出的dat1就是当天的日期

3、system_clock(time)

这个输出的是毫秒,多线程用的是这个方法

integer time
CALL system_clock(time)

好了,今天就到这里吧,要去看论文了。。。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Fortran中,可以使用矩形法和梯形法来求解定积分。矩形法的原理是将积分区间分成若干个小矩形,通过计算每个小矩形的面积来近似积分值。梯形法的原理是将积分区间分成若干个梯形,通过计算每个梯形的面积来近似积分值。 下面是使用矩形法和梯形法求解定积分Fortran代码示例: 1. 矩形法求定积分: ```fortran program definiteintegralbyrectangular implicit none real, parameter :: pi = 3.1415926 integer, parameter :: N = 100 ! 调整精度 real lowbound, upbound, len, x, sum, f lowbound = 0 ! 输入下界 upbound = pi ! 输入上界 len = (upbound - lowbound) / N sum = 0.0 x = lowbound do while (x < upbound) f = cos(x) - x**2 ! 输入要积分的函数 sum = sum + f * len x = x + len end do write(*, *) 'The final result = ', sum pause end program definiteintegralbyrectangular ``` 2. 梯形法求定积分: ```fortran program definiteintegralbyrectangular implicit none real, parameter :: pi = 3.1415926 integer, parameter :: N = 100 ! 调整精度 real lowbound, upbound, len, x, sum, f1, f2 lowbound = 0 ! 输入下界 upbound = pi ! 输入上界 len = (upbound - lowbound) / N sum = 0.0 x = lowbound do while (x < upbound) f1 = cos(x) - x**2 ! 输入要积分的函数 f2 = (cos(x + len) - (x + len)**2) * len / 2 sum = sum + (f1 + f2) x = x + len end do write(*, *) 'The final result = ', sum pause end program definiteintegralbyrectangular ``` 希望以上代码能够帮助你在Fortran中求解定积分。如果你还有其他相关问题,请随时提出。 相关问题: 1. 如何在Fortran中使用Simpson法求解定积分? 2. 如何在Fortran中求解多重积分? 3. 如何在Fortran中使用数值积分方法求解概率密度函数的面积?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值