6

Matlab で解く 1 次微分方程式の単純なシステムがあります。次のようになります。

function passing
y0 = [0; 0];
t = 0:0.05:1;
y = myprocedure(@myfunc,0.05,t,y0);
myans = y'
end

function f = myfunc(t,y)
f = [-y(1) + y(2);
     -0.8*t + y(2)];
end

function y=myprocedure(f,h,t,y0)
n = length(t);
y = zeros(length(y0),n);
y(:,1) = y0;
for i=1:n-1
    k1 = f(t(i),y(:,i));
    k2 = f(t(i)+h/2, y(:,i)+h/2*k1);
    k3 = f(t(i)+h/2, y(:,i)+h/2*k2);
    k4 = f(t(i)+h, y(:,i)+h*k3);
    y(:,i+1) = y(:,i)+h/6*(k1+2*k2+2*k3+k4);
end
end

したがって、passing.m ファイルを実行すると、次の結果が得られます。

>> passing

myans =

     0         0
-0.0000   -0.0010
-0.0001   -0.0041
-0.0005   -0.0095
-0.0011   -0.0171
-0.0021   -0.0272
-0.0036   -0.0399
-0.0058   -0.0553
-0.0086   -0.0735
-0.0123   -0.0946
-0.0169   -0.1190
-0.0225   -0.1466
-0.0293   -0.1777
-0.0374   -0.2124
-0.0469   -0.2510
-0.0579   -0.2936
-0.0705   -0.3404
-0.0849   -0.3917
-0.1012   -0.4477
-0.1196   -0.5086
-0.1402   -0.5746

今、passing.m コードを Fortran 90 に変換しようとしています。多くのことを試しましたが、まだ道に迷っています。特に、配列の初期化を行ったり、関数を他の関数に渡したりするときです。

どんな助けでも大歓迎です。ありがとう!

== 編集:

上記の Matlab コードを Fortran 90 で複製することに成功しました。ポインターを作成する方法はまだわかりませんが、"interface" ステートメントは機能しているようです。コードを見て、いくつかの入力を提供していただければ幸いです。ありがとう。

module odemodule
implicit none
contains
function odef(a,b)
 implicit none
 real::a
 real::b(2)
 real::odef(2)
 odef(1) = -b(1) + b(2)
 odef(2) = -0.8*a + b(2)
end function odef
subroutine rk4(f,h,t,y0,y)
 implicit none
 real,dimension(2,21)::y
 real,dimension(2)::k1,k2,k3,k4
 real::h
 real::t(21)
 real::y0(2)
 integer::i
 interface
  function f(a,b)
   real::a
   real::b(2), f(2)
  end function f
 end interface
 y(1,1)=y0(1)
 y(2,1)=y0(2)
 do i=1,20     
 k1 = f(t(i),y(:,i))
 k2 = f(t(i)+h/2, y(:,i)+h/2*k1)
 k3 = f(t(i)+h/2, y(:,i)+h/2*k2)
 k4 = f(t(i)+h, y(:,i)+h*k3)
 y(:,i+1) = y(:,i)+h/6*(k1+2*k2+2*k3+k4)
 end do
end subroutine rk4
end module odemodule

program passing
  use odemodule
implicit none
real,parameter::dt=0.05
real::yinit(2)
real::y(2,21)
integer::i
real::t(21)
t(1)=0.0
do i=2,21
t(i)=t(i-1)+dt
end do
yinit(1)=0
yinit(2)=0
call rk4(odef,dt,t,yinit,y)
do i=1,21
  write(*,100) y(1,i), y(2,i)
enddo
100 format(f7.4,3x,f7.4)
end program passing
4

2 に答える 2

6

Fortran で関数を選択して他のプロシージャ (サブルーチンまたは関数) に渡す最良の方法は、プロシージャ ポインタを使用することです。そうすれば、一般的な方法でプロシージャを記述し、特定の関数で呼び出すことができます。以下にいくつかの例を示します: Fortran で関数名を別名にする方法と Fortran関数ポインター配列

配列を初期化する方法はたくさんあります。たとえば、すべての要素を同じ値に初期化できます。

array = 0.0

http://en.wikipedia.org/wiki/Fortran_95_language_featuresを参照してください

于 2012-08-29T16:26:14.293 に答える