Показать сообщение отдельно
Старый 27.05.2012, 11:19   #8 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Анастасия93 Посмотреть сообщение
Мне бы хоть примерную программу,а потом , я по ходу буду уже с преподавателем изменять её(если потребуется).
Хорошо, попробуем. Итак, в качестве примера рассматривается интеграл от функции 1/х². Можно сосчитать его в пределах от 0.1 до ∞, благо известно, что он равен 10. Поскольку в программе подынтегральная функция задана через подпрограмму, она, естественно, может быть заменена другой. Вероятно, в этом и состоит "универсальность".
Для вычисления интеграла в программе применен метод парабол (Симпсона). Алгоритм работы программы:

1. Ввод исходных данных:
а) нижний предел (в данном случае ввести 0.1).
б) некое исходное разумное значение верхнего предела; в дальнейшем при работе программы верхний предел будет наращиваться. При тестировании введите несколько десятков, скажем, 10, или 20, или 27 - не так уж и важно. Очень большие числа нежелательны. Равно как и слишком маленькие. Ориентируйтесь на область, где подынтегральная функция уже спадает раз в 10-100 от исходных значений.
в) точность результата.

2. Ищется оптимальный шаг путем увеличения числа точек промежутка от нижнего до исходного верхнего предела.

3. Наращивается верхний предел с сохранением ранее полученного шага разбиения.

4. Выводится результат.

Код:
Var
 a,b,b0,eps,Simp1,Simp2:Real;
 j,N,N0:Integer;

Function F(z:real):real;
begin
 F:=1/Sqr(z);
end;

Function Simpson(As,Bs:Real; Ns:Integer):Real;
var
 i:Integer;
 Sum,h:Real;
begin
 h:=(Bs-As)/(2*Ns);
 Sum:=(F(As)+F(Bs))/3*h;
 for i:=1 to Ns do
  Sum:=Sum+4.0*h/3.0*F(As+h*(2*i-1));
 for i:=2 to Ns do
  Sum:=Sum+2.0*h/3.0*F(As+h*(2*i-2));
 Simpson:=Sum;
end;

Begin
 Write('Lower limit = ');
 Readln(a);
 Write('Upper limit (initial value) = ');
 Readln(b0);
 b:=b0;
 Write('Accuracy (e.g. 0.0001) = ');
 Readln(Eps);
 N0:=10;
 N:=N0;
 Simp2:=Simpson(a,b,N);
 Repeat
  Simp1:=Simp2;
  N:=N+N0;
  Simp2:=Simpson(a,b,N);
 Until Abs(Simp1-Simp2)<Eps;
 N0:=N;
 Repeat
  Simp1:=Simp2;
  b:=b+b0;
  N:=N+N0;
  Simp2:=Simpson(a,b,N);
 Until Abs(Simp1-Simp2)<Eps;
 Writeln('Result:  ',Simp2:0:(Round(Ln(1/Eps)/Ln(10))+1));
 Readln
End.
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070