Модераторы: volvo877, Snowy, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Интеграл 
V
    Опции темы
Studeht
Дата 25.4.2009, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 6.4.2009
Где: Тула

Репутация: нет
Всего: нет



Здравствуйте Господа эксперты! Решил обратиться к Вам за помощью. Задание следующее:вычислить интеграл для функции заданной графически График функции во вложении. Вот мои наработки:
Код

{$N+}
program task1;
uses crt;

procedure InputData(var a,b,c,d,fd,Eps:extended);
begin
  write('Введите точность вычислений Eps=');
  readln(Eps);
  write('Введите c=');
  readln(c);

  repeat
    write('Введите d=');
    readln(d);
    if (d<=c) then
      writeln('Значение d должно быть больше значения c');
  until (d>c);
  write('Введите значение функции в точке d=');
  readln(fd);
  write('Введите нижний предел интегрирования a=');
  readln(a);
  write('Введите верхний предел интегрирования b=');
  readln(b);
end;

function F(x,c,d,fd:extended; n:longint):extended;
var res:extended;
    i:longint;
begin
  for i:=1 to n do
    if (x>=-c) and (x<=c) then
        res:=0
    else if (x>=d) then
        res:=fd
    else if (x<=-d) then
        res:=(-1)*fd
    else if (x>c) and(x<d) then
        res:=fd*(x-c)/(d-c)
    else
        res:=(-1)*fd*(abs(x)-c)/(d-c);
    F:=res;
end;

procedure StepOfCalculation(b,a:extended; var n:longint; var h:extended);
begin
  n:=1;
  n:=2*n;
  h:=(b-a)/n;
end;

function CalculationIntegral(n:longint; I1,Eps,c,d,fd,h,a,b:extended; var x:extended):extended;
var i:longint;
    I2:extended;
begin
  repeat
    I1:=0;
    I2:=0;
    I1:=I2;
    for i:=1 to n do
      x:=a+h*i;
      if a>b then
        I2:=I2+F(x,c,d,fd,n)*(-h)
      else
        I2:=I2+F(x,c,d,fd,n)*h;
  until (abs(I2-I1)<Eps);
  CalculationIntegral:=I2;
end;

procedure OutputData(n:longint; I1,h,a,b,x,Eps,c,d,fd:extended);
begin
  writeln('Значение интеграла равно ',CalculationIntegral(n,I1,Eps,c,d,fd,h,a,b,x));
end;

var n:longint;
    a,b,c,d,Eps,x,fd,I1,h,I2:extended;
begin
  clrscr;
  InputData(a,b,c,d,fd,Eps);
  StepOfCalculation(b,a,n,h);
  F(x,c,d,fd,n);
  OutputData(n,I1,h,a,b,x,Eps,c,d,fd);
  readln;
end.

Проблема в следующем: при запуске программа просит ввести все входные параметры, после чего она просто зависает, и  я не знаю по какой причине  smile Помогите плз. Заранее огромное спасибо!!!

Это сообщение отредактировал(а) Studeht - 25.4.2009, 18:53

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  Doc2.doc 21,50 Kb
PM MAIL   Вверх
volvo877
Дата 25.4.2009, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



Цитата(Studeht @  25.4.2009,  18:52 Найти цитируемый пост)
я не знаю по какой причине
Как это "по какой"? По простой:
Цитата(Studeht @  25.4.2009,  18:52 Найти цитируемый пост)
Код
  repeat
    I1:=0;
    I2:=0;
    I1:=I2;
    for i:=1 to n do
      x:=a+h*i;
      if a>b then
        I2:=I2+F(x,c,d,fd,n)*(-h)
      else
        I2:=I2+F(x,c,d,fd,n)*h;
  until (abs(I2-I1)<Eps);
И что у тебя здесь происходит? В какой-то момент времени что, функция F начнет выдавать другие результаты? По какой причине Abs(i2 - i1) станет меньше эпсилона, если этого не произошло изначально, на первой же итерации? Мож тебе обнуление i1, i2 не в цикле надо делать? А скобки begin/end под For-ом ты не забыл? А то вычисляешь ты каждый раз одно и то же, вычисляешь Xконечное, и потом - функцию в этой точке...
PM MAIL   Вверх
ФедосеевПавел
Дата 25.4.2009, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 7.2.2009

Репутация: 2
Всего: 10



Когда я попытался запустить, то завис в бесконечном цикле в CalculationIntegral.
Там I1 и I2 сначала обнуляются, потом вычисляется I2 и выход из цикла при abs(I2-I1)<Eps. Т.е. к моменту сравнения I1==0.0, а I2==какому-то значению. Кроме того, внутри этого цикла, видимо, предполагалось удвоение точек интегрирования.

Ещё, на выходе следующей функции n всегда будет равен 2.
Код

procedure StepOfCalculation(b,a:extended; var n:longint; var h:extended);
begin
  n:=1;
  n:=2*n;
  h:=(b-a)/n;
end;


Действуй.
PM   Вверх
Studeht
Дата 25.4.2009, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 6.4.2009
Где: Тула

Репутация: нет
Всего: нет



Вот попытался учесть ваши замечания, но видимо у меня это не совсем получается потому что результат тот же. Вот то что получилось:
Код

{$N+}
program task1;
uses crt;

procedure InputData(var a,b,c,d,fd,Eps:extended);
begin
  write('Введите точность вычислений Eps=');
  readln(Eps);
  write('Введите c=');
  readln(c);

  repeat
    write('Введите d=');
    readln(d);
    if (d<=c) then
      writeln('Значение d должно быть больше значения c');
  until (d>c);
  write('Введите значение функции в точке d=');
  readln(fd);
  write('Введите нижний предел интегрирования a=');
  readln(a);
  write('Введите верхний предел интегрирования b=');
  readln(b);
end;

function F(x,c,d,fd:extended; n:longint):extended;
var res:extended;
    i:longint;
begin
  for i:=1 to n do
    begin
      if (x>=-c) and (x<=c) then
          res:=0
      else if (x>=d) then
          res:=fd
      else if (x<=-d) then
          res:=(-1)*fd
      else if (x>c) and(x<d) then
          res:=fd*(x-c)/(d-c)
      else
          res:=(-1)*fd*(abs(x)-c)/(d-c);
    end;
    F:=res;
end;

procedure StepOfCalculation(b,a:extended; var n:longint; var h:extended);
begin
  n:=2*n;
  h:=(b-a)/n;
end;

function CalculationIntegral(n:longint; I1,Eps,c,d,fd,h,a,b:extended; var x:extended):extended;
var i:longint;
    I2:extended;
begin
  I1:=0;
  I2:=0;
  I1:=I2;
  n:=1;

  repeat
    StepOfCalculation(b,a,n,h);
      for i:=1 to n do
        begin
          x:=a+h*i;
          F(x,c,d,fd,n);
          if a>b then
            I2:=I2+F(x,c,d,fd,n)*(-h)
          else
            I2:=I2+F(x,c,d,fd,n)*h;
        end;
  until (abs(I2-I1)<Eps);
  CalculationIntegral:=I2;
end;

procedure OutputData(n:longint; I1,h,a,b,x,Eps,c,d,fd:extended);
begin
  writeln('Значение интеграла равно ',CalculationIntegral(n,I1,Eps,c,d,fd,h,a,b,x));
end;

var n:longint;
    a,b,c,d,Eps,x,fd,I1,h,I2:extended;
begin
  clrscr;
  InputData(a,b,c,d,fd,Eps);
  OutputData(n,I1,h,a,b,x,Eps,c,d,fd);
  readln;
end.

Я хоть в том направлении двигаюсь?
PM MAIL   Вверх
ФедосеевПавел
Дата 25.4.2009, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 7.2.2009

Репутация: 2
Всего: 10



Код

function F(x,c,d,fd:extended; n:longint):extended;
var res:extended;
    i:longint;
begin
  for i:=1 to n do   <-- Зачем?


Ещё ты, наверное, не разобрался что хочешь получить в CalculationIntegral...
Нужно:
1 n:=1; начальное приближение интеграла I2:=0
2. В начале цикла запомнить предыдущее вычисление интеграла в переменной I1  и удвоить n.
3. Вычислить интеграл (I2:=0; потом в цикле от 1 до n I2:=I2+F()*h)
4. Если abs(I2-I1)<Eps - конец вычислений, иначе п.2.

Измени на
Код

function CalculationIntegral(n:longint; I1,Eps,c,d,fd,h,a,b:extended; var x:extended):extended; 
.................
begin
  n:=1;
  I2:=0;{принимаем начальное значение интеграла равным 0}

  repeat
    I1:=I2; {запоминаем результат предыдущей итерации}
    StepOfCalculation(b,a,n,h); {удваиваем количество интервалов интегрирования}
    {вычисление интеграла}
    I2:=0;
      for i:=1 to n do


Также, не могу понять смысл конструкции
Код

      if a>b then
        I2:=I2+F(x,c,d,fd,n)*(-h)
      else
        I2:=I2+F(x,c,d,fd,n)*h;

Может, всё же
Код

        I2:=I2+F(x,c,d,fd,n)*h;



---------------------------------------------
И уже в качестве пожелания - просмотри заголовки процедур и функций и удали из их параметров явно лишние.

Это сообщение отредактировал(а) ФедосеевПавел - 25.4.2009, 21:24
PM   Вверх
Studeht
Дата 25.4.2009, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 6.4.2009
Где: Тула

Репутация: нет
Всего: нет



Спасибо огромное ФедосеевПавел!!! 
Цитата

Также, не могу понять смысл конструкции
код Pascal/Delphi 
1: if a>b then
2:   I2:=I2+F(x,c,d,fd,n)*(-h)
3: else
4:   I2:=I2+F(x,c,d,fd,n)*h;

Смысл этой конструкции по замыслу заключался в том что если например интеграл от 0 до 10 равен 1, то интеграл от 10 до 0 равен -1. Спасибо Вам еще раз!!!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

Запрещается!

1. Обсуждать и делится взломанными компонентами или программным обеспечением

2. Публиковать ссылки на варез

3. Оффтопить

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема »


 




[ Время генерации скрипта: 0.0533 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.