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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.08.2009, 21:21   #1
Lex_okha
 
Регистрация: 19.08.2009
Сообщений: 3
Вопрос интересная проблема с числами.

Проблема в следующем.
Имеется рабочая программа на паскале.
копирую и вставляю в делфи, графику и выводы переобозначиваю как надо. Проблема только в дном месте в программе при входе в одну из процедур переобозначаюся переменные! совершенно произвольными цифрами типа 1.4е-314 или типа такого числа близкие к нулю при выходе изпроцедуры значения цифр возвращается в нормальное(предположительно), так как первые две част использующие эту процедуру работаю вроде бы как надо, а когда дело доходит до более больших цифр и дальнейшего времени то комп зависает с ошибкой нехвтки памяти!!! после того как он загребает 1 гиг файла подкачки.
В чем может быть причина?

процедур описана так

Код:
procedure Mersonhi(
 n,rt:integer;
 var y:vector;
 var mstb:vector;
 var hc:real;
 hmin:real;
 eps:real;
 var t:real;
 var flag:integer;
 var hp:real);
  label 2; 
var i,iter:integer;
 y1,y2,f0,f1,f2:vector;
 err,temp,h:real;
 ok:boolean;
убирал "lable 2" некоторые цифры стали нормальные, но переменные: err,eps,hmin все равно меняются!

Заранее спасибо.

Последний раз редактировалось Stilet; 20.08.2009 в 08:29.
Lex_okha вне форума Ответить с цитированием
Старый 19.08.2009, 21:25   #2
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Цитата:
процедур описана так
Как?
Цитата:
произвольными цифрами типа 1.4е-314
Если это цифра, то бросьте дальше программировать.
puporev вне форума Ответить с цитированием
Старый 19.08.2009, 21:31   #3
Lex_okha
 
Регистрация: 19.08.2009
Сообщений: 3
По умолчанию

Что вы все цепляетесь к словам????
мозги кипят за всем не уследить!

Я типа "начинающий прогамист."
пытаюсь разобраться в программе написанной одним умным профессором, когда то на паскале.


Код:
procedure Mersonhi(
  n,rt:integer;
  var y:vector;
  var mstb:vector;
  var hc:real;
  hmin:real;
  eps:real;
  var t:real;
  var flag:integer;
  var hp:real);
  { label 2; }
var i,iter:integer;
  y1,y2,f0,f1,f2:vector;
  err,temp,h:real;
  ok:boolean;

begin
iter:=0;
  flag:=0;h:=hc;

  repeat
       iter:=iter+1;
    prav(t,y,f0);
    for i:=1 to n do y1[i]:=y[i]+h*f0[i]/3.0;
    prav(t+h/3,y1,f1);
    for i:=1 to n do y1[i]:=y[i]+(f0[i]+f1[i])*h/6;
    prav(t+h/3,y1,f1);
    for i:=1 to n do y1[i]:=y[i]+(f0[i]+3*f1[i])*h/8;
    prav(t+h/2,y1,f2);
    for i:=1 to n do y1[i]:=y[i]+(f0[i]-3*f1[i]+4*f2[i])*h/2;
    prav(t+h,y1,f1);
    err:=1e-30;
    for i:=1 to n do begin
      y2[i]:=y[i]+(f0[i]+4*f2[i]+f1[i])*h/6;
      temp:=abs(0.2*(y1[i]-y2[i])/mstb[i]);
      if temp>err then err:=temp;
    end{for};
    ok:=err<eps;
    if ok then begin
      t:=t+h;      y:=y2
    end{if};

    if ok or (iter<2) then begin h:=h*exp(ln(0.8*eps/err)/5.0);
    end;
      if (h>hp) then begin
                      h:=hp;       { goto 2  }
                     end;
      if (h<hp) then
        begin
          h:=h/2;
             if h<hmin then begin
                             flag:=13;        exit
             end{if};
       end;
{2:}until ok;
    hc:=h;
end;

Последний раз редактировалось Stilet; 20.08.2009 в 08:29.
Lex_okha вне форума Ответить с цитированием
Старый 20.08.2009, 08:20   #4
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Господи помилуй!
Это что за абракадабра!

Вот привёл в более читабельное состояние
Код:
procedure Mersonhi(n, rt: integer; var y, mstb: vector; var hc, hmin, eps, t: real;
var flag:integer; var hp:real);
var
i, iter: integer;
y1, y2, f0, f1, f2: vector;
err, temp, h: real;
ok: boolean;
begin
   iter := 0;
   flag := 0;
   h := hc;
   repeat
      iter := iter + 1;
      prav(t, y, f0);

      for i := 1 to n do
         y1[i] := y[i] + h * f0[i] / 3.0;

      prav(t + h / 3, y1, f1);

      for i := 1 to n do
         y1[i] := y[i] + (f0[i] + f1[i]) * h / 6;

      prav(t + h / 3, y1, f1);

      for i := 1 to n do
         y1[i] := y[i] + (f0[i] + 3 * f1[i]) * h / 8;

      prav(t + h / 2, y1, f2);

      for i:=1 to n do
         y1[i] := y[i] + (f0[i] - 3 * f1[i] + 4 * f2[i]) * h / 2;

      prav( t + h ,y1 ,f1);
      err := 1e-30;

      for i := 1 to n do
      begin
         y2[i] := y[i] + (f0[i] + 4 * f2[i] + f1[i]) * h / 6;
         temp := abs(0.2 * (y1[i] - y2[i]) / mstb[i]);
         if temp > err then err := temp;
      end{for};
      ok := err < eps;
      if ok then
      begin
         t := t + h;
         y := y2;
      end{if};

      if ok or (iter < 2) then
      begin
         h := h * exp(ln(0.8 * eps / err) / 5.0);
      end;

      if (h > hp) then
      begin
         h := hp;
         { goto 2 }
      end;

      if (h < hp) then
      begin
         h := h / 2;
         if h < hmin then
         begin
            flag :=13;
            exit;
         end{if};
      end;
   {2:}until ok;
   hc := h;
end;
Теперь, vector, как объявлена его структура? И что за функция prav.

Возможно алгоритм в бесконечный цикл вылетает? Не может такого быть?

И вообще, чё это за функция?

//Теги кода, кнопка , не просто так там....
Altera вне форума Ответить с цитированием
Старый 20.08.2009, 08:31   #5
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Выходов из твоей процедуры, как я понял, 2:
а) с ошибкой
б) при h < hmin

Отслеживай h при больших числах.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 20.08.2009, 08:58   #6
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Вот почитал я про Метод Рунге-Кутта пятого порядка, модификация Мерсона и конечно ничего не понял. Но я также не понимаю как человек решающий такие сложные математические задачи может путать числа и цифры, это же вбито в память и пальцы по умолчанию должно быть.
puporev вне форума Ответить с цитированием
Старый 20.08.2009, 16:39   #7
Lex_okha
 
Регистрация: 19.08.2009
Сообщений: 3
Вопрос

vector, как объявлена его структура?
Type vector=array[1..n] of real;

при первом обращении к это процедуре n=2 и она считается -- файл подкачки 10 метров
при втором n=13 и она тоже считает, но долго (5-10 секунд) -- файл подкачки 30-40 метров
при третьем обращении переполняет память -- файл подкачки до 1 гиг

комп норм 2 ядра 2 гига как положено.


И что за функция prav.
Это большая функция... но при входе в нее из процедуры mersonhi переменные становятся нормальными.

Я убирал ссылку на неё(исключал части процедуры) - проблема остается!


переменные принимают значения типа:
например h=0.0001 шаг интегрирования становится пимерно 3,2 * 10 в -306 степени.
если ставить расширение Extended то значение становится порядка 10 в 4036 степени или что то такое.

алгоритм не бесконечный. Выходы в нем
1- по достижении h величины hmin но как я не пробовал этого обычноне происходило
2- при достижении условия err<eps
eps - фиксировано err считается

как я еще посидел проблема в том что у меня величина h уходит в диапазон малых значений 2,5 * 10 в -9 за счет этого малого шага... идет забивание памяти и процес обрывается!

так что возможно программа и считает! но почему идете переназначение переменных???


P.S. программа имеет много UNITов, встечался с делфи видал много косяков и неустойчивостей в рабочих отлаженных программах,
может ли большое число юнитов повлиять на что либо? эта процедура описана в разных и ведет себя везде одинаково.
Lex_okha вне форума Ответить с цитированием
Старый 20.08.2009, 19:18   #8
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Как вариант стоит проверить не совпадают ли имена твоих функций в различных модулях? И переназначение переменных обычно обозначает что они не инициализированы, так что обрати внимание на это.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задачи с числами Alexxx92 Помощь студентам 4 26.04.2011 05:42
Интересная проблема... Vitalik1234 Софт 3 13.06.2009 01:25
Файл с числами cu2zoff Паскаль, Turbo Pascal, PascalABC.NET 0 20.05.2009 21:16
Работа с числами Drain Общие вопросы Delphi 10 11.02.2008 16:35