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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.11.2011, 13:52   #1
Psychoo
 
Регистрация: 05.11.2011
Сообщений: 5
По умолчанию Интеграл

Помогите пожалуйста найти ошибку в вычислениях.Програма компилируется,но при заданых значениях выбивает еxitcode 210.Как увидел,суть в ошибке програмного кода,но еще новичок и ошибку увы не могу найти.Заранее благодарен
Код:
program lab4;
var a,b,e,h,S1,S2,R,d:real;i,n,k,j,m:integer;p:Char;
function f(x:real):real;
begin
f:=x*x;
end;
begin
 repeat
 writeln('Vvedit a,b,e');
 readln(a,b,e);
 writeln('1-Left rectangular');
 writeln('2-Right rectangular');
 writeln('3-Middleline rectangular');
 writeln('4-Trapeze');
 writeln('5-Parabola');
 writeln('6-BD');
 readln(n);
 m:=1;
 S1:=(b-a)*f(a);
  repeat
  m:=m*2;
  h:=(b-a)/m;
  S2:=0;
  case n of
  1:
  begin
  for i:=0 to m-1 do S2:=S2+f(a+i*h);
  S2:=S2*h;
  end;
  2:
  begin
  for i:=1 to m do S2:=S2+f(a+i*h);
  S2:=S2*h;
  end;
  3:
  begin
  for i:=1 to m do S2:=S2+f(a+i*h-h/2);
  S2:=h*S2;
  end;
  4:
  begin
  for i:=0 to m-1 do S2:=S2+f(a+i*h)+f(a+(i+1)*h);
  S2:=S2*(h/2);
  end;
  5:
  begin
  for i:=0 to m do S2:=S2+k*f(a+i*h);
  S2:=S2*h/3;
  if(i=0)and(i=m)then k:=1;
  if(i mod 2=0)then k:=2 else k:=4;
  end;
  6:
  begin
  d:=h/4;
  for i:=0 to m-1 do
       for j:=0 to 4 do
       begin
       if (j=0) and (j=4) then K:=7;
       if (j=1) and (j=3) then K:=32;
       if (j=2) then K:=12;
       S2:=K*f(a+i*h+j*d);
       end;
  S2:=S2*((2*d)/45);
  end;
end;
R:=abs(S2-S1);
until R<e;
S1:=S2;
writeln(S2:10:7);
writeln(m);
writeln('Repeat Y/N?');
readln(p);
until p='N';
readln;
end.
Psychoo вне форума Ответить с цитированием
Старый 07.11.2011, 07:33   #2
<- DelpHIFanat ->
Пользователь
 
Аватар для <- DelpHIFanat ->
 
Регистрация: 07.11.2011
Сообщений: 58
По умолчанию

Может быть Вам мой код поможет, т. к. ошибки искать в коде (особенно в чужом) для меня, например, дело хлопотное. И, на мой взгляд, как-то не совсем хорошо выбирать метод интегрирования в цикле (скорее всего ошибка именно там), в котором оно делается: для этого лучше каждый метод описать отдельной функцией, а потом, в зависимости от требований, вызывать нужную из них.
Код:
// Интегрируемая функция
Function F(x:Extended):Extended;
Begin
  F:=Sqr(x);
End;

// метод верхних (левых) прямоугольников
Function VerhRectIntegral(a, b: Extended; N: Integer): Extended;
Var
  dx, Summa, x, y: Extended;
  i: Integer; // Индекс
Begin
  Summa:=0;
  dx:=(b-a)/N; // Рассчитал приращение
  x:=a+dx; // Начальное значение х
  For i:=1 To N Do
    Begin  // Мотаю цикл от 1 до N
      y:=F(x); // Пересчитываю значение функции
      Summa:=Summa+y; // Складываю все игреки
      x:=x+dx; // Пересчитываю текущий икс
    End;
  Summa:=Summa*dx; // Всё, что я там наскладывал умножаю на приращение
  VerhRectIntegral:=Summa;
End;

// метод нижних (правых) прямоугольников
Function NizRectIntegral(a, b: Extended; N: Integer): Extended;
Var
  dx, Summa, x, y: Extended;
  i: Integer; // Индекс
Begin
  Summa:=0;
  dx:=(b-a)/N; // Рассчитал приращение
  x:=a; // Начальное значение х
  For i:=0 To N-1 Do
    Begin  // Мотаю цикл от 0 до N-1
      y:=F(x); // Пересчитываю значение функции
      Summa:=Summa+y; // Складываю все игреки
      x:=x+dx; // Пересчитываю текущий икс
    End;
  Summa:=Summa*dx; // Всё, что я там наскладывал умножаю на приращение
  NizRectIntegral:=Summa;
End;

// Это у меня функция, которая считает интеграл методом трапеций
Function Integral(a, b: Extended; N: Integer): Extended;
Var
  dx, Summa, x, y: Extended;
  i: Integer; // Индекс
Begin
  Summa:=0;
  dx:=(b-a)/N; // Рассчитал приращение
  x:=a; // Начальное значение х
  For i:=0 To N Do
    Begin  // Мотаю цикл от 0 до N
      y:=F(x); // Пересчитываю значение функции
      If ((i=0) Or (i=N)) Then y:=y/2; // Проверяю условие
      Summa:=Summa+y; // Складываю все игреки
      x:=x+dx; // Пересчитываю текущий икс
    End;
  Summa:=Summa*dx; // Всё, что я там наскладывал умножаю на приращение
  Integral:=Summa; // Результат присваиваю функции
End;

// интеграл методом Симпсона (приближает параболой)
Function SimpsonIntegral(a, b: Extended; N: Integer): Extended;
Var
  dx, Summa, x, y: Extended;
  i: Integer; // Индекс
Begin
  Summa:=0;
  dx:=(b-a)/N; // Рассчитал приращение
  x:=a; // Начальное значение х
  For i:=0 To N Do
    Begin  // Мотаю цикл от 0 до N
      y:=F(x); // Пересчитываю значение функции
      If ((Odd(i)=False) And (i>0) And (i<N)) Then y:=y*2
      Else If ((Odd(i)=True) And (i<N)) Then y:=y*4; // Проверяю условие
      Summa:=Summa+y; // Складываю все игреки
      x:=x+dx; // Пересчитываю текущий икс
    End;
  Summa:=Summa*dx/3; // Всё, что я там наскладывал умножаю на приращение
  SimpsonIntegral:=Summa;
End;
В архиве моя готовая прога.
Вложения
Тип файла: zip Интегральчики.zip (236.1 Кб, 15 просмотров)
Лучше вообще не иметь знаний о чём-то, чем иметь неправильные знания об этом!..
<- DelpHIFanat -> вне форума Ответить с цитированием
Старый 07.11.2011, 07:42   #3
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Цитата:
Сообщение от Psychoo Посмотреть сообщение
Помогите пожалуйста найти ошибку в вычислениях.Програма компилируется,но при заданых значениях выбивает еxitcode 210.
При каких заданных значениях происходит ошибка? У меня при значениях
1 2 3
3
- никакой ошибки не было.
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Интеграл=) Psychoo Паскаль, Turbo Pascal, PascalABC.NET 2 05.11.2011 22:18
интеграл Feel401 Обсуждение статей 0 15.05.2011 12:27
Интеграл atenon Свободное общение 10 14.12.2010 19:23
Интеграл bkm03262 Паскаль, Turbo Pascal, PascalABC.NET 1 09.05.2009 14:50