Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.03.2013, 17:24   #1
sam999999
Новичок
Джуниор
 
Регистрация: 27.03.2013
Сообщений: 1
По умолчанию Метод Рунге-Кутты 4го порядка Pascal

Здравствуйте. Нужен взгляд человека понимающего Pascal. Расчёт уравнений двигателя постоянного тока по второму закону Киргофа методом Рунге-Кутты 4го порядка, кратко о нём:
1.Закон Киргофа для ДПТ:
U=I*R+L*∂I/∂t+ω*Ce;
I*Cm=J*∂ω/∂t+Mст
далее уравнения приводятся к форме задачи Коши:
∂I/∂t=(U-I-R-ω*Ce)/L
∂ω/∂t=(I*Cm-Mст)/J
далее уравнения дифференцируют для удобства записи (на шаге k+1):
Ik+1=Ik+Δt*(U-Ik-R-ωk*Ce)/L
ωk+1=ωk+Δt*(Ik*Cm-Mст)/J
и собственно сам метод Рунге-Кутты
k11 = dt*((U-Ik*R-ωk*Ce)/L)
k21 = dt*((U-Ik*R-ωk*Ce)/L) + k11/2
k31 = dt*((U-Ik*R-ωk*Ce)/L) + k21/2
k41 = dt*((U-Ik*R-ωk*Ce)/L) + k31/2

k12 = dt*((Ik*Cm-Mc)/J)
k22 = dt*((Ik*Cm-Mc)/J) + k12/2
k32 = dt*((Ik*Cm-Mc)/J) + k22/2
k42 = dt*((Ik*Cm-Mc)/J) + k32/2
тогда
Ik=(Ik+1/6*(k11+k21*2+k31*2+k41))
ωk=(ωk+1/6*(k12+k22*2+k32*2+k42))


Теперь пытаюсь осуществить этот метод на Pascal. В 20 строке вещественное переполнение, могут быть и другие ошибки, поэтому прошу вашей помощи.

Код:
Program RK_4;

uses crt;

var i,n:integer;

    Ua,Ra,La,Cef,Cmf,Js,Mc:real;

    fi_,fw_:array[0..1000] of real;

    k1,k2,k3,k4,k11,k21,k31,k41,dt,t,tmax:real;

    ff:text;


function difurI(Ua,fi_,Ra,Cef,fw_,La:real):real;

begin

difurI:=(Ua-fi_*Ra-Cef*fw_)/La;

end;

function difurW(Cmf,fi_,Mc,Js:real):real;

begin

difurW:=(Cmf*fi_-Mc)/Js;

end;

begin

Ua:= 220.0;

Ra:= 0.03;

Cef:= 0.2;

Cmf:= 1.2;

La:= 0.01;

Js:= 1.0;

Mc:= 1000.0;


fi_[0]:=0;

fw_[0]:=0;

t:=0;

dt:=0.001;

n:=0;

write('Calculating Runge-Kutta4...');

while (n<100) do begin

k1:=dt*difurI(t+dt,fi_[n],fw_[n],Ua,Ra,La);

k2:=dt*(difurI(t+dt,fi_[n],fw_[n],Ua,Ra,La)+k1/2);

k3:=dt*(difurI(t+dt,fi_[n],fw_[n],Ua,Ra,La)+k2/2);

k4:=dt*(difurI(t+dt,fi_[n],fw_[n],Ua,Ra,La)+k3);

k11:=dt*difurW(t+dt,fi_[n],Mc,Js);

k21:=dt*(difurW(t+dt,fi_[n],Mc,Js)+k11/2);

k31:=dt*(difurW(t+dt,fi_[n],Mc,Js)+k21/2);

k41:=dt*(difurW(t+dt,fi_[n],Mc,Js)+k31);

t:=t+dt; inc(n);

fi_[n]:=fi_[n-1]+(k1+k2*2+k3*2+k4)/6;

fw_[n]:=fw_[n-1]+(k11+k21*2+k31*2+k41)/6;

end;writeln('Done!');


begin
clrscr;
assign(ff,'n.txt');
rewrite(ff);

      tmax:=100.0;
      dt:=0.001;

      for i:=1 to n do
      begin
        fi_[0]:=0.0;
      END;
      fi_[1]:=999;


      T:=0.0;
      writeln(ff,'  (t)        (i)       (w);');


while (t <= tmax) do
      begin
        difurI(t+dt,fi_[n],fw_[n],Ua,Ra,La);
      end;
      begin
        difurW(t+dt,fi_[n],Mc,Js);
      end;
        T:=T+dt;
        write(ff,T:12:5);
        for i:=1 to n do
        begin
          write(ff,fi_[n]:12:5);
        end;
        begin
          write(ff,fw_[n]:12:5);
        end;

        writeln(ff,'');
      end;

close(ff);

END.
sam999999 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Метод рунге-кутты 4 порядка riko782 Помощь студентам 0 14.05.2012 22:38
Метод Рунге-Кутты peace on you Общие вопросы C/C++ 2 13.12.2011 12:17
Метод Рунге-Кутты smbd2011 Общие вопросы C/C++ 5 16.09.2011 23:14
Метод Рунге-Кутты smbd2011 Помощь студентам 0 16.09.2011 20:43
Метод Рунге Кутты и Эйлера Nikolai17 Помощь студентам 1 20.05.2010 11:42