![]()  | 
	
 
  | 
		
			
  | 	
	
	
		
		|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны | 
![]()  | 
	
	
| 
		 | 
	Опции темы | Поиск в этой теме | Опции просмотра | 
| 
	 | 
| 
		 
			 
			#1  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Добрый вечер, господа!=) 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	Очень давно не писал на паскале/дельфине, а тут попросили знакомые помочь с интегрированием. Сам никогда мат. частью задач не занимался, а тут такой нежданчик=( Сам алгоритм нашел, но работает он на мой взгляд не очень верно. Код: 
	program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils;
var A, B, S, h, integ:REAL;
n,i:integer;
function f(x:real):real;
begin
f := 2.46573;
end;
begin
a:=0;
b:=100;
n:=0.1;
h := (b - a) / n;
for i := 1 to n-1 do
begin
S := S + f(a + h * i);
end;
integ := h * ( ( f(a) + f(b) ) / 2 + S);
writeln(integ:0:4);
Readln;
end.В цикле сумма не меняется, шаг интегрирования по заданию 0.1, а здесь целочисленный вообще. Возвращаемое значение от ф-ии f() взял для наглядности, возвращаемое значение интеграла по заданию для него должно быть 231.63661. Задание лежит вот тут, тема 4, задание 2, вариант 2. Методичка тут, но в ней только сама формула. Ребят, извините пожалуйста, что вот так вот все криво, просто сейчас запар на работе и по другому не получается=( Заранее спасибо.  | 
| 
		 
			 
			#2  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 И что возвращает функция f: 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	Код: 
	function f(x:real):real; begin f := 2.46573; end ... S := S + f(a + h * i); ... integ := h * ( ( f(a) + f(b) ) / 2 + S); ...  | 
| 
		 
			 
			#3  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 В исходном варианте, как я понял, возвращает результат подинтегрального выражения. 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	Код: 
	function f(x:real):real; begin f := 1+SIN(X); end;  | 
| 
		 
			 
			#4  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Вот не нужно заменять то, в чём не разобрался. Ты подаёшь разные значения на "вход" и получаешь разные на "выходе", а заменил одним фиксированным. 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#5  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Да, это я уже понял. Максимально к требуемому результату подобрался путем изменения n методом перебора. 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	Код: 
	program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils;
var A, B, S, h, integ:REAL;
n,i:integer;
function f(x:real):real;
begin
f := (3*ln(x+1))/(1+ln(x+1));
end;
begin
a:=0;
b:=100;
n:=3000;
h := (b - a) / n;
for i := 1 to n-1 do
begin
S := S + f(a + h * i);
end;
integ := h * ( ( f(a) + f(b) ) / 2 + S);
writeln(integ:0:5);
Readln;
end.Извини за глупые вопросы, но просто физически не смогу перерыть всю мат. часть за короткий срок( Заранее спасибо.  | 
| 
		 
			 
			#6  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Все, разобрался, оказалось достаточно посмотреть ВУЗовские тетрадки за первый курс). 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	Код: 
	program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils;
function f(x:real):real;
begin
f := (3*ln(x+1))/(1+ln(x+1));
end;
function trap(a,b:integer):real;
var S, h,k,n, integ:REAL;
i:integer;
begin
n:= b/0.1;
h := (b - a) / n;
k:=0;
while k < n do
begin
    S := S + f(a + h * k);
    k:= k+ 1;
end;
result := h * ( ( f(a) + f(b) ) / 2 + S);
end;
var i:integer;
begin
i:=50;
while i <= 300 do begin
    writeln(trap(0,i):0:5);
    i:= i+50;
end;
Readln;
end.Нужно было просто просчитать кол-во шагов итераций и делов-то. Один минус - при b, равном нулю, происходит ошибка, дебаг не работает нормально, на вскидку определить не могу. Может кто сразу найдет ошибку? Заранее спасибо)  | 
| 
		 
			 
			#7  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Я стормозил) Жаль я не умею делить на ноль( 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	Конечный вариант решения задачи: Код: 
	program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils;
function f(x:real):real;
begin
f := (3*ln(x+1))/(1+ln(x+1));
end;
function trap(a,b:integer):real;
var S, h, k, n:REAL;
begin
n:= b/0.1;
S := 0;
if n = 0 then
    h := 0
else
    h := (b - a) / n;
k:=0;
while k < n do
begin
    S := S + f(a + h * k);
    k:= k+ 1;
end;
result := h * ( ( f(a) + f(b) ) / 2 + S);
end;
var i:integer;
begin
i:=0;
while i <= 300 do begin
    writeln(trap(0,i):0:5);
    i:= i+50;
end;
Readln;
end.Спасибо.  |