Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Метод Рунге-Кутта. Перевести код с паскаля на дэльфи. Помогите понять его.  (Прочитано 12031 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Tomoyo
Участник

ru
Offline Offline

« : 16-02-2010 15:42 » 

Условие задачи:
Газовая смесь, содержащая   (% объёмных) хлора и   (% объёмных) воздуха, обрабатывается в насадочном абсорбере водным раствором NaOH с целью удаления из смеси 99,5% хлора.
   Объёмная скорость газового потока -    . Процесс абсорбции проводится при температуре газового потока 17   и атмосферном давлении Р = 1 атм. Диаметр абсорбера составляет    . Структуру газового потока в колонне можно интерпретировать моделью идеального вытеснения.
   Требуется рассчитать высоту насадочного слоя     в колонне, при которой достигается требуемая степень поглощения хлора, т.е. 99,5%, если массовая скорость потока жидкой фазы (водного раствора NaOH), орошающего слой насадки, достаточна для обеспечения рабочего режима процесса хемосорбции. Конечное уравнение представляет собой:
 dy/dz=-0.5*S_a/G_vm*sqr(1-y)*ln(1/(1-y))*exp(0.8*ln((71*y/(1-y)+29)*G_vm/S_a));
Где S_a-площадь поперечного сечения абсорбера
     G_vm- мольная скорость потока воздуха

Теперь сам готовый код:
Код:
Program A;
uses crt;
var
i:integer;
k1,k2,k3,k4,k5,h,z,y,S_a,G_vm:real;
Function f(y:real): real;

begin
 G_vm:=0.00042*(100-50)*120;
 S_a:=pi*sqr(0.45)/4;
 f:=-0.5*S_a/G_vm*sqr(1-y)*ln(1/(1-y))*exp(0.8*ln((71*y/(1-y)+29)*G_vm/S_a));
end;

begin
 clrscr;
 h:=0.0001;
 z:=0; y:=0.5; i:=0;
 Repeat
 z:=z+h;
 i:=i+1;
 k1:=h*f(y);
 k2:=h*f(y+k1);
 k3:=h*f(y+k1/2+k2/2);
 k4:=h*f(y+3*k1/8+9*k3/8);
 k5:=h*f(y+3*k1/2-9*k3/2+6*k4);
 y:=y+1/6*(k1+4*k4+k5);
 if ((i=1) or (10204-i<6)
 or (i mod 500=0)) then

begin
 writeln('z=',z:6:4,'y=',y:6:6);
 readln;
end;

until(y<=0.005);
readln;
end.
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #1 : 16-02-2010 15:57 » 

1. очищает экран
2. инциализирует переменные
3. в цикле считается значение y по основной формуле
4. на определённых значениях итератора (i) выводит результат на экран
5. завершает цикл, когда y становится меньше заданной погрешности.

чтобы расписать более детально, надо понимать предметную область, а это уже не ко мне. для перевода на дельфи следует заменить real на extended, вывод перенаправить в TMemo или что-то похожее (это если требется именно оконная прога). а консольное приложение (на дельфи) должно скомпилироваться и так.
Записан

Tomoyo
Участник

ru
Offline Offline

« Ответ #2 : 16-02-2010 16:00 » 

Что означает i mod 500=0? И почему нужно перенаправлять в TMemo, а не в TEdit? Просто у меня на TEdit ругается не пойму почему. Правда я уже некоторое время не программировала, по памяти пишу z:=floattostr(edit6.text).
« Последнее редактирование: 16-02-2010 16:03 от Tomoyo » Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #3 : 16-02-2010 16:03 » 

это означает, что остаток от деления i на 500 = 0. т.е. i является числом, кратным 500.

в TMemo надо выводить, потому что в течении работы цикла на экран результат может выводится многократно. т.е. нужен многострочный элемент управления.
Записан

x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #4 : 16-02-2010 16:05 » 

z:=floattostr(edit6.text)

это вы пытаетесь присвоить в z значение из Edit6.Text, а вам надо наоборот выводить значения. ругается потому, что FloatToStr преобразует вещественное число в строку, а вы передаёт в неё не число, а строку (Edit6.Text).
Записан

Tomoyo
Участник

ru
Offline Offline

« Ответ #5 : 16-02-2010 16:11 » 

edit6.Text:=floattostr(z); Спасибо Вам большое!!! Еще такой вопрос: как вывести в результат в TMemo? Интересно посмотреть, что получится.
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #6 : 16-02-2010 16:26 » 

Memo1.Lines.Add ('Z = ' + FloatToStr (z));
Записан

Tomoyo
Участник

ru
Offline Offline

« Ответ #7 : 16-02-2010 17:19 » new

Спасибо Вам еще раз.
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #8 : 16-02-2010 17:27 » 

anytime Ага
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines