真的非常感谢,我打算从头开始再做一遍 |
你的问题太多了,我都不知道该怎么给你说起。 比如: 1. 数组定义时不要用浮点数做为数组的大小。 2. 函数的接口一定要明确,例如 function f(r,p,m) 是三个参数,但 rungekutta 函数里调用却写成了 k1=f(x(i),y(i)) 只有2个参数。并且 f q 函数的定义是返回大小为 20000 的数组,但 rungekutta 里面却认为返回的是一个单变量。 real,external::f 这样的写法并不会让编译器帮助你检查函数接口,所以 interface 是更好的选择。 3. 一定要写 implicit none,例如 rungekutta 函数里没有写,导致 p0 没有定义,也没有值。(昨天给你提出来,但你没有改) 昨天提的死循环的问题也没有改。 4. 大量相同大小的常数,例如 20000,990 可以写成 integer , parameter :: N = 2000 , S = 990 这样后期比较容易修改。 我给你的建议是,先从简单的代码写起。能得心应手的书写一二十行的代码之后,再来写几百行的代码。 每个程序单元,先做单元测试。然后再组织成稍大的程序。 例如,你先确定从 EOS.txt 中读取数组,单步调试,确保读取的数组是正确的。 然后,再调试插值函数,确保 spline 插值后的结果是符合自己预期的。(实际上,你的死循环就出现在插值函数里) 一般来说,从 EOS中读取数组,插值。是先做的,而你的代码逻辑是,每次对 f 和 q 求解,都去读 EOS文件、插值。显然是做了很多无用功。 最后,确保读取数据和插值正确了,再调试龙格库塔。 注意认真分析,每个函数应该设计几个参数?输入应该是什么,输出应该是什么?是单变量还是数组?数组的话,大小应该是多大? |
捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )
GMT+8, 2024-11-23 11:08