Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran 如何在do循环中区分结果和前一个结果?_Fortran_Gfortran - Fatal编程技术网

Fortran 如何在do循环中区分结果和前一个结果?

Fortran 如何在do循环中区分结果和前一个结果?,fortran,gfortran,Fortran,Gfortran,此子程序用于确定复合梯形so 我想在最终结果(积分)和上一个结果(积分-1)之间提取(差异),并使用差异作为重复间隔数的限制 子程序梯形(a、b、n、积分) 实数,外部::f 实数:h,a,b,summ,p 真实、意图(输出):集成 整数::n 整数::i,j !这里我们得到的整个方程是(h/2)*[f(a)+f(b)+2*和(Xi) 我们先计算第一部分(h/2)*[f(a)+f(b),然后再计算第二部分 i=1,n吗 n=2**i!间隔数的两倍 h=(b-a)/n!计算δX p=(h/2.)*

此子程序用于确定复合梯形so

我想在最终结果(积分)和上一个结果(积分-1)之间提取(差异),并使用差异作为重复间隔数的限制

子程序梯形(a、b、n、积分)
实数,外部::f
实数:h,a,b,summ,p
真实、意图(输出):集成
整数::n
整数::i,j
!这里我们得到的整个方程是(h/2)*[f(a)+f(b)+2*和(Xi)
我们先计算第一部分(h/2)*[f(a)+f(b),然后再计算第二部分
i=1,n吗
n=2**i!间隔数的两倍
h=(b-a)/n!计算δX
p=(h/2.)*(f(a)+f(b))
总和=0
do j=1,n-1
summ=summ+h*f(a+j*h)!h/2*2*sum[f(Xi)
恩多
如果(n==256),那么!对间隔的数量进行限制
停止
如果结束
积分=p+sum!这里是两部分的和
打印*,n',,集成
结束循环
结束子程序
因此,我想确定差值,而不是极限值为250,当差值小于10*-8时,停止
我尝试了很多,但没有得到我想要的。

我会像下面这样做(很快就被砍掉了)。请注意,对于默认种类reals 1e-8,期望的精度是不切实际的-因此公差较低。如果你想要更高的精度,你需要使用更高精度种类real

请注意,我已经将此转化为一个完整的程序。在问题中,请您自己做。纯粹出于自私,您将更有可能得到有用的答案

不管怎样,这是代码

程序集成
隐式无
实数,参数::pi=3.1415927
实数:值,增量
整数::n_已使用
内在的:罪恶
调用梯形(sin,0.0,pi/2.0,20,使用n_,值,增量)
写入(*,*)“最终结果”,值,“使用”,2**n_,“间隔”
包含
子程序梯形(f,a,b,n_max,n_used,integration,delta)
隐式无
实数,参数::tol=1e-4
接口
函数f(x)结果(r)
Real::r
真实意图(In)::x
端函数f
端接口
真实的,真实的意图
真实,意图(In)::b
整数,意图(In)::n_max
整数,意图(输出)::n\u已使用
真实、意图(输出):集成
真实,意图(外)::增量
实数:h,sum,p
真实的:集成
整数::n
整数::i,j
这里我们得到的整个方程是(h/2)*[f(a)+f(b)+2*和(Xi)
我们先计算第一部分(h/2)*[f(a)+f(b),然后再计算第二部分
增量=-巨大(增量)
集成旧=巨大(集成旧)
i=1,n_max
n=2**i!间隔数的两倍
h=(b-a)/n!计算δX
p=(h/2.)*(f(a)+f(b))
总和=0
Do j=1,n-1
summ=summ+h*f(a+j*h)!h/2*2*sum[f(Xi)
恩多
积分=p+sum!这里是两部分的和
如果(i/=1),则
增量=集成-集成\u旧
写入(*,*)n',积分,增量
如果(Abs(增量)
ian@eris:~/work/stack$gfortran--版本
GNU Fortran(Ubuntu 7.4.0-1ubuntu1~18.04.1)7.4.0
版权所有(C)2017免费软件基金会。
这是免费软件;请参阅源代码了解复制条件。没有
担保;甚至不是为了适销性或特定用途的适用性。
ian@eris:~/work/stack$gfortran-Wall-Wextra-fcheck=all-O-std=f2008 integ.f90
ian@eris:~/work/stack$/a.out
4 0.987115800 3.90563607E-02
8 0.996785223 9.66942310E-03
16 0.999196708 2.41148472E-03
32 0.99979252 6.02543354E-04
64 0.999949872 1.50620937E-04
1280.999987483.76105309E-05
最终结果0.999987483,128个间隔

非常感谢。那么答案是否正确,是否正是您想要的?如果正确,请标记以避免其他人在上面浪费时间it@jack你为什么要为代码块添加
pascal
?@jack这个答案已经5年了。从那时起,引擎被更换了,并被广泛宣布@VladimirF谢谢你提供的信息。我不会是我们不再使用pascal!@VladimirF似乎不支持Fortran。您使用哪个标记来突出显示?@jack Highlight.js确实支持Fortran。我请求SO导入它。