Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Помогите решить (http://www.tehnari.ru/f41/t100438/)

Вилена 07.01.2015 00:49

Помогите решить
 
Составить программу вычисления приближенных значений определенного интеграла методом трапеций и парабол(методом Симпсона), а также точное значение по первообразной. Вычислить абсолютную и относительную ошибки для каждого приближенного метода. Пределы интгерирования a и b, а также число N подынтервалов задавать при вводе. Выполняя программу при вводимых N = 10k, где к = 1, 2,..,8, установить зависимость величин ошибок от N.
Подынтегральная функция ((e^(x))-e^(-x))/2
Первообразная подынтегральной функции ((e^(x))+e^(-x))/2

Очень нужна срочно помощь!
буду благодарна премного, если напишете код!:tehnari_ru_837:

Вилена 07.01.2015 00:50

ах да, программа нужна на Pascal

Vladimir_S 07.01.2015 09:47

Вилена, и Вам здравствовать, и Вас с Рождеством! Впрочем, судя по имени, Рождество для Вас не актуально.
Теперь по заданию.
Вообще-то подобные задачки у нас рассматривались неоднократно, ну да ладно, получите:
Код:

Var
 a,b,AV,T,S:Real;
 k:Byte;

Function F(x:Real):Real;
begin
 F:=0.5*(Exp(x)-Exp(-x));
end;

Function Antiderivative(x:Real):Real;
begin
 Antiderivative:=0.5*(Exp(x)+Exp(-x));
end;

Function Trapezium(N:Byte):Real;
var
 i:Byte;
 Sum,h:Real;
begin
 h:=(b-a)/N;
 Sum:=(F(a)+F(b))/2*h;
 for i:=1 to N-1 do
  Sum:=Sum+h*F(a+h*i);
 Trapezium:=Sum;
end;

Function Simpson(N:Byte):Real;
var
 i,N1:Byte;
 Sum,h:Real;
begin
 N1:=N div 2;
 h:=(b-a)/(2*N1);
 Sum:=(F(a)+F(b))/3*h;
 for i:=1 to N1 do
  Sum:=Sum+4.0*h/3.0*F(a+h*(2*i-1));
 for i:=2 to N1 do
  Sum:=Sum+2.0*h/3.0*F(a+h*(2*i-2));
 Simpson:=Sum;
end;

Begin
 Write('a = ');
 Readln(a);
 Write('b = ');
 Readln(b);
 AV:=Antiderivative(b)-Antiderivative(a);
 WriteLn('Accurate value: ', AV:0:8);
 Writeln;
 for k:=1 to 8 do
  begin
  T:=Trapezium(k*10);
  S:=Simpson(k*10);
  Writeln('k= ',k, '    Trapezium: ',T:0:8, '    Abs.Err: ',Abs(T-AV):0:8,'    Rel.Err: ',Abs(T-AV)/AV*100:0:8,'%');
  Writeln('k= ',k, '    Simpson:  ',S:0:8, '    Abs.Err: ',Abs(S-AV):0:8,'    Rel.Err: ',Abs(S-AV)/AV*100:0:8,'%');
  end;
 Readln;
End.


Вилена 07.01.2015 16:50

Здравствуйте. Я русская, не волнуйтесь, но из-за сессии любые праздники не актуальны очень.
и Вас с Рождеством!
Спасибо большое за программу!

Vladimir_S 07.01.2015 17:41

Цитата:

Сообщение от Вилена (Сообщение 1093987)
Я русская, не волнуйтесь, но из-за сессии любые праздники не актуальны очень.

А, так эта шпилька с моей стороны не по поводу национальности - ни в коем случае. Просто имена "Вилен", "Вилена" - это новоделы 20-30 годов прошлого века, и произошли от Владимир Ильич Ленин. Вот я и подумал - может быть, Вы воспитаны на коммунистической идеологии, потому так и написал.
Извините за некоторую вольность.

Вилена 07.01.2015 18:12

нет-нет, все нормально!
Это, сказать можно, прозвище мое.

По поводу задания - хотела спросить, а есть ли возможность то же самое сделать, только без использования функций?
Мы их еще не проходили...

Vladimir_S 07.01.2015 18:16

Цитата:

Сообщение от Вилена (Сообщение 1094022)
По поводу задания - хотела спросить, а есть ли возможность то же самое сделать, только без использования функций?

Можно и без функций. Сейчас нарисую.

Vladimir_S 07.01.2015 18:39

Ну вот, пожалуйста.
Хотя, сами видите - получилось громоздко, нечитабельно и некрасиво. Так что осваивайте работу с процедурами и функциями! :)
Код:

Var
 a,b,AV,T,S,h:Real;
 i,k,N:Byte;

Begin
 Write('a = ');
 Readln(a);
 Write('b = ');
 Readln(b);
 AV:=0.5*(Exp(b)+Exp(-b))-0.5*(Exp(a)+Exp(-a));
 WriteLn('Accurate value: ', AV:0:8);
 Writeln;
 for k:=1 to 8 do
  begin
  h:=(b-a)/(k*10);
  T:=(0.5*(Exp(a)-Exp(-a))+0.5*(Exp(b)-Exp(-b)))/2*h;
  for i:=1 to k*10-1 do
    T:=T+h*0.5*(Exp(a+h*i)-Exp(-a-h*i));
  N:=k*10 div 2;
  h:=(b-a)/(2*N);
  S:=(0.5*(Exp(a)-Exp(-a))+0.5*(Exp(b)-Exp(-b)))/3*h;
  for i:=1 to N do
    S:=S+4.0*h/3.0*0.5*(Exp(a+h*(2*i-1))-Exp(-a-h*(2*i-1)));
  for i:=2 to N do
    S:=S+2.0*h/3.0*0.5*(Exp(a+h*(2*i-2))-Exp(-a-h*(2*i-2)));
  Writeln('k= ',k, '    Trapezium: ',T:0:8, '    Abs.Err: ',Abs(T-AV):0:8,'    Rel.Err: ',Abs(T-AV)/AV*100:0:8,'%');
  Writeln('k= ',k, '    Simpson:  ',S:0:8, '    Abs.Err: ',Abs(S-AV):0:8,'    Rel.Err: ',Abs(S-AV)/AV*100:0:8,'%');
  end;
 Readln;
End.


Вилена 07.01.2015 18:42

Благодарю!
увы, преподаватель пока требует так, чтоб по программе:)


Часовой пояс GMT +4, время: 12:00.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.