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

Технический форум (http://www.tehnari.ru/)
-   Delphi, Kylix and Pascal (http://www.tehnari.ru/f43/)
-   -   Интегрирование функций методом трапеций. Паскаль (http://www.tehnari.ru/f43/t245399/)

Алекс2 04.04.2016 01:47

Интегрирование функций методом трапеций. Паскаль
 
Подынтегральная функция 1 + sqrt(х)* (2+sin^2 x), а=0, b=1

а) Вычислить заданный интеграл при n=10.
б) Вычислить значение заданного интеграла при n=20, 30, 40, …, 100. Результаты показать в виде таблицы на экране и в файле;


Если я применю эту программу будет ли она работать и будет ли правильним ответ? и чтобы была таблица на экране и в файле.
Я пока не могу проверить.
Подскажите пожалуйста.
Если нет , то исправте, пожалуйста.

const a=0;{нижний предел}
b=1;{верхний предел}
n=10;

function f(x:real):real;
begin
f:=1+ sqrt(х)*(2+sin^2x);
end;

function integral(a,b:real):real;
var h,k,s,y:real; i:integer;
begin
h:=(b-a)/n;
s:=(f(a)+f(b))/2;
k:=a;
for i:=1 to n-1 do
begin
k:=k+h;
s:=s+f(k);
end;
s:=s*h;
integral:=s;
Writeln('Длина шага равна: ',h:0:4);{ тут я не знаю правильно или нет}
end;

begin
Writeln('Нижний предел: ',a: ); { тут возле а должна быть цыфра я не знаю какая }
Writeln('Верхний предел: ',b:); { и тут тоже}
writeln('Интеграл методом трапеции = ', integral(a,b):0:5);
end.

Vladimir_S 04.04.2016 10:09

Цитата:

Сообщение от Алекс2 (Сообщение 2368469)
Если я применю эту программу будет ли она работать

Нет, в таком виде не будет.
Цитата:

Сообщение от Алекс2 (Сообщение 2368469)
const a=0;{нижний предел}
b=1;{верхний предел}

Пределы интегрирования лучше задать в вещественном формате, а значит написать так:
const a=0.0;{нижний предел}
b=1.0;{верхний предел}
Величину n вообще не следует задавать в виде константы: ведь Вам нужно будет считать интеграл при разных значениях разбиения.
Цитата:

Сообщение от Алекс2 (Сообщение 2368469)
f:=1+ sqrt(х)*(2+sin^2x);

В Паскале нет символа ^, точнее, есть, но он используется совсем для другого (обозначает указатель при работе с динамическими переменными), а вовсе не как знак возведения в степень. Поэтому функцию следует задать так:
f:=1+ Sqrt(х)*(2+Sqr(sin(x)));
Цитата:

Сообщение от Алекс2 (Сообщение 2368469)
function integral(a,b:real):real;

Поскольку нижний и верхний предел у Вас заданы как константы, нет смысла задавать их, как параметры функции. А вот число шагов разбиения - другое дело. Я бы задал так:
function integral(n:integer):real;
Цитата:

Сообщение от Алекс2 (Сообщение 2368469)
{ тут я не знаю правильно или нет}

Правильно. Вообще - разбирайтесь с форматами вывода целых и вещественных чисел. Ничего там сложного нет.
Цитата:

Сообщение от Алекс2 (Сообщение 2368469)
{ тут возле а должна быть цыфра я не знаю какая }

Да... так же, как и в других выводах. Например, :0:4.

С учетом вышесказанного:
Код:

const
 a=0.0;{lower limit}
 b=1.0;{upper limit}

function f(x:real):real;
begin
 f:=1+Sqrt(x)*(2.0+Sqr(sin(x)));
end;

function integral(m:integer):real;
var
 h,k,s:real;
 i:integer;
begin
 h:=(b-a)/m;
 s:=(f(a)+f(b))/2;
 k:=a;
 for i:=1 to m-1 do
 begin
  k:=k+h;
  s:=s+f(k);
 end;
 s:=s*h;
 integral:=s;
end;

Var
 n,j:Integer;

Begin
 Writeln('    n        Integral');
 for j:=1 to 10 do
  begin
  n:=j*10;
  writeln(n:7, integral(n):16:6);
  end;
 Readln
End.


Алекс2 05.04.2016 00:09

Добрый вечер, или скорее доброй ночи, Vladimir_S. Огромное Вам спасибо за помощь!!!

Алекс2 05.04.2016 00:25

Посмотрите пожалуйста на метод Зэйделя. Я узнал что надо.


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

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