Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >调用Fortran77中的DDASPK求解器会对数组中的某些点产生奇怪的结果

调用Fortran77中的DDASPK求解器会对数组中的某些点产生奇怪的结果
EN

Stack Overflow用户
提问于 2015-03-13 00:44:47
回答 1查看 228关注 0票数 0

我用DDASPK用直线法求解抛物型偏微分方程。下面是求解器正在调用的子例程:

代码语言:javascript
运行
AI代码解释
复制
SUBROUTINE RES(T,Y,YPRIME,CJ,DELTA,IRES,IPAR,RPAR)

  IMPLICIT DOUBLE PRECISION (A-H, O-Z)
  DIMENSION Y(*), YPRIME(*), DELTA(*), V(201), LAP3V(201)
  H = 0.05D0
  NPTS = 201

  DO 50 I = 1,NPTS
     V(I) = Y(I+1)
50   CONTINUE

  DO 60 J = 4,(NPTS-3)
     LAP3V(J) = (V(J-3) - 6.0D0*V(J-2) + 15.0D0*V(J-1) - 
 &   20.0D0*V(J) + 15.0D0*V(J+1) - 6.0D0*V(J+2) + 
 &   V(J+3))/(H**6.0D0)
60   CONTINUE

  LAP3V(1) = (2.0D0*V(4) - 12.0D0*V(3) + 30.0D0*V(2) - 
 &20.0D0*V(1))/(H**6.0D0)
  LAP3V(2) = (V(5) - 6.0D0*V(4) + 16.0D0*V(3) - 26.0D0*V(2) +
 &15.0D0*V(1))/(H**6.0D0)
  LAP3V(3) = (V(6) - 6.0D0*V(5) + 15.0D0*V(4) - 20.0D0*V(3) + 
 &16.0D0*V(2) - 6.0D0*V(1))/(H**6.0D0)
  LAP3V(NPTS-2) = 0.0D0
  LAP3V(NPTS-1) = 0.0D0
  LAP3V(NPTS) = 0.0D0

  DELTA(1) = YPRIME(1) - 1.0D0
  DO 70 K = 1,NPTS
     DELTA(K+1) = YPRIME(K+1) - LAP3V(K)
 70   CONTINUE

  RETURN
  END

这里LAP3V是一维空间中拉普拉斯函数的离散化三次幂(所以是六阶导数),在第一列中,我们将它与简单的ODE (1)/dt=1耦合在一起(为什么,你会问?当我可以启动并运行它时,我最终将解决更困难的PDE,对于这些PDE,最好将求解器采取的时间步长与解决方案的某些方面耦合起来)。

然而,当我尝试从求解器中调用它时(这是完全隐式的,所以它的第一项工作是在T=0的输入Y的情况下计算一致的YPRIME ),除了两个点之外,一切似乎都正常-在数组的第一个条目中,它很快从0(我在时间0的时候将YPRIME(1) =1作为初始猜测)转换为inf,然后是-nan,原因我不明白-这应该是最简单的部分。同样在YPRIME(NPTS-3)中,我们很快就得到了一个非常大的负数(大约是-1e9),而它周围的条目是零。我相信这一定与这是在do循环中分配的最终条目有关,而不是逐个案例,但我对fortran还不够熟悉,无法理解修复它的内容或方法。

感谢您的帮助,谢谢。

EN

回答 1

Stack Overflow用户

发布于 2015-03-13 19:56:07

如果没有完整的源代码,就很难确切知道发生了什么。

然而,根据我的经验,每当数组值开始接受奇怪的值(Inf、NaN等)时,几乎总是由于错误地引用了数组值。不正确的数组引用将导致使用引用其他变量的内存,甚至是存储部分二进制可执行文件的位置(在这种情况下,对该位置的赋值通常会导致seg错误和程序崩溃)。

有几种可能的常见场景需要检查(这不一定是详尽的!):

  • 使用假定大小的数组(例如,Y(*)),很容易意外地读取或写入超过数组末尾的数组(例如,在DO 50循环中,如果Y至少有202个元素,那么就有问题了!)。如果你声明了一个可分配的数组,但是分配失败了,请确保你的所有数组都是正确的。

  • 你关于你的IPAR和dimensioned.

  • If数组被销毁的评论告诉我,其他例程中可能也有一个bug导致了越界的数组赋值。

还要记住,试图求解一组非线性方程来获得一致的导数是非常重要的,并且可能导致找不到有效的解。除了尝试找到更好的初始猜测和/或尝试分析计算导数(如果您可以做到这一点)之外,您对此无能为力。

最后,还有最后一个使用DASPK的技巧。求解器并不关心res子例程的Fortran版本。在Fortran 90中重写RES子例程,从长远来看,您会更快乐!(这也适用于代码的其余部分。Fortran 90比Fortran 77要好得多,除非你别无选择,否则编写新的Fortran 77是疯狂的。) /so 90比Fortran 77好得多。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29022963

复制
相关文章
R中的循环绘图
上面我们将每一张图都单独输出了,下面来介绍如何将其全部组合起来,分别介绍两种R包的方法gridExtra&patchwork
R语言数据分析指南
2022/09/21
4.1K0
R中的循环绘图
python中for循环加速_如何提高python 中for循环的效率[通俗易懂]
对于某个城市的出租车数据,一天就有33210000条记录,如何将每辆车的数据单独拎出来放到一个专属的文件中呢?
全栈程序员站长
2022/09/22
3.6K0
java中如何将嵌套循环性能提高500倍
转载请注明出处https://www.cnblogs.com/funnyzpc/p/15975882.html
上帝
2022/05/10
6470
可以提高云计算性能的6种技术
很多企业致力于追求最佳的应用程序性能,但实现它并非易事。在基于主机的内部部署IT环境中,企业必须提供适当调整的资源以实现性能目标。而采用云计算技术将使这些考虑因素变得更加复杂,因为它限制了用户可以定制基础设施和其他可用功能的程度。
静一
2019/05/22
1.1K0
可以提高云计算性能的6种技术
在Python和R中使用交叉验证方法提高模型性能
模型表现差异很大的可能原因是什么?换句话说,为什么在别人评估我们的模型时会失去稳定性?
拓端
2021/01/28
1.6K0
在Python和R中使用交叉验证方法提高模型性能
VMware Workstation 提高性能的方法
实测非常管用,能有效避免硬盘疯狂被读取导致噪音很大的情况! 首先打开编辑->首选项 Paste_Image.png 点击左侧内存,将额外内存修改为第一项调整所有虚拟机内
飞奔去旅行
2019/06/13
1.6K0
VMware Workstation 提高性能的方法
可能提高GAN性能的方法介绍
生成器试图找到最好的图像来欺骗鉴别器。当两个网络互相对抗时,“最佳”图像不断变化。但是,优化可能会变得过于贪心,使其陷入永无止境的猫捉老鼠游戏中。这是模型不收敛和模式崩溃的原因之一。
AiTechYun
2018/07/27
1.6K0
可能提高GAN性能的方法介绍
如何提高C++中for循环的效率
1. 不假思索的写法(最为常见,且最耗时) 测试用时:0.000143s clock_t startTime,endTime; startTime = clock(); vector<double> row(100); double sum=0; for(unsigned int i=0;i<1000;i++) { for(unsigned int j=0;j<row.size();j++) {
用户9831583
2022/06/16
2K0
提高模型性能,你可以尝试这几招...
在EZDL到底怎样,试试看…一文中,我尝试了百度推出的在线人工智能设计平台EZDL,其愿景是任何人不用编写一行代码就可以轻松地构建、设计和部署人工智能(AI)模型。从试用效果上看,确实不需要编写一行代码,也不需要什么人工智能知识。但对于一名程序员而言,将人工智能包装到一个黑盒子中,而自己毫无掌控感,总有那么一点不踏实。
云水木石
2019/07/01
1.1K0
提高模型性能,你可以尝试这几招...
【测评】提高R运行效率的若干方法
【画图】与SARS-CoV-2病毒结合ACE2基因表达正相关的LncRNA有哪些?
Chris生命科学小站
2023/02/28
1.3K0
【测评】提高R运行效率的若干方法
提高 PHP 7 的性能的几个方法
PHP7 已经发布了, 作为 PHP 10 年来最大的版本升级, 最大的性能升级, PHP7 在多放的测试中都表现出很明显的性能提升, 然而, 为了让它能发挥出最大的性能, 我还是有几件事想提醒下.
Yangsh888
2022/03/29
5400
一种绝对提高开发水平的方法
AntConc 使用工具软件可以把一本电子档中的单词全部提取出来,并分析其出现频率
IT小马哥
2020/03/18
5290
一种绝对提高开发水平的方法
如果做了多年开发的你发现自己的水平一直上不去,你可能要提高自己的英文水平了,英语就是你技术的瓶颈,对有些人可能是硬伤。
张果
2018/07/31
9.1K2
一种绝对提高开发水平的方法
如何提高 Java 中锁的性能
两个月前向Plumbr公司引进线程死锁的检测之后,我们开始收到一些类似于这样的询问:“棒极了!现在我知道造成程序出现性能问题的原因了,但是接下来该怎么做呢?”
哲洛不闹
2018/09/19
1K0
提高java程序性能的小方法
1、避免使用错误的方式,尽量不用instanceof做条件判断,不要将数组声明为:public static final 。 2、使用java中效率高的类,比如尽量使用HashMap 和ArrayList ,除非必要,否则不推荐使用HashTable和Vector ,后者由于使用同步机制,而导致了性能的开销。 3、尽量指定类的final修饰符 带有final修饰符的类是不可派生的。在Java核心API中,有许多应用final的例子,例如java.lang.String。为String类指定final防止了人
神秘的寇先森
2018/05/30
7920
Python中的循环-比较和性能
Python是当今最受欢迎的编程语言之一。这是一种具有优雅且易读语法的解释性高级语言。但是,Python通常比Java,C#尤其是C,C ++或Fortran慢得多。有时性能问题和瓶颈可能会严重影响应用程序的可用性。
计算机与AI
2020/12/14
3.4K0
Python中的循环-比较和性能
计算机最早提高性能的方法
随着本系列进展,我们知道计算机进步巨大,从 1 秒 1 次运算,到现在有千赫甚至兆赫的CPU,这是很大的计算量。
硬核编程
2019/08/19
5290
点击加载更多

相似问题

提高R中嵌套For循环的性能

26

提高R中嵌套循环的性能

11

有没有一种方法可以提高NativeScript中scss文件加载的性能?

10

有没有一种方法可以简化R中利用循环的函数?

13

有没有一种方法可以提高我的简单文本过滤器的性能?

55
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档