forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Алгоритмика (http://forum.boolean.name/forumdisplay.php?f=21)
-   -   Условие в задаче с интегралом (http://forum.boolean.name/showthread.php?t=13838)

Protey 05.12.2010 23:21

Условие в задаче с интегралом
 
PHP код:

var
  
n:integer;  //кол-во отрезков
  
a:integer;  //левая граница
  
b:integer;  //правая граница
  
dx:real;
  
rez:real;  //будущий ответ
  
xi,xi1:real;  //отрезок 1 и отрезок 2
  
h:real;
  
y0,y1,y2,y3,y4:real;
  
inter:real;  //накапливаяемая сумма
  
i:integer;  //переменная, необходимая для великой миссии
  
E:real;  //необходимая точность

function y(x:real):real;
begin
  Result
:=sqrt(2*x+1);
end;

begin
  WriteLn
('Please input border integral(a,b): ');  //просьба ввести границы интеграла
    
ReadLn(a,b);  //границы интерграла
  
WriteLn;
  
WriteLn('Enter the desired accuracy: ');  //просьба ввести желаемую точность
    
ReadLn(E);  //E - необходимая точность
  
WriteLn;

  
rez := 0;  //зануляем на всякий случай переменную
  
:= 1;  //начальное кол-во отрезков
  
dx :=(b-a)/n;

  if 
>= b then WriteLn('Sorry, my bad')  //защита от дурака
    
else

  for 
i:=0 to n-do
    while (
rez-rez+1)/rez do  //собственно условие на проверку точности
      
begin
         xi
:=dx*i;
         
xi1:=dx*(i+1);
         
h:=(xi1-xi)/4;
         
y0:=y(xi);
         
y1:=y(xi+h);
         
y2:=y(xi+2*h);
         
y3:=y(xi+3*h);
         
y4:=y(xi1);
         
inter:=(2*h/45)*(7*y0+32*y1+12*y2+32*y3+7*y4);
         
rez:=rez+inter;
      
end;

 
WriteLn('Response to your example: ',rez:6:5);  //ответ вашего примера
 
WriteLn;
 
WriteLn('Press ENTER to exit...');  //показание к действию
 
ReadLn;
end

while (rez-rez+1)/rez < E do - вот это условие нужно поменять так, чтобы выполнялась идея:
Цитата:

пользователь вводит границы интеграла (а и б), необходимую точность (Е), далее машина считает до тех пор пока некая формула, имеющая в себе результат, не получит ответ менее заданной погрешности

impersonalis 06.12.2010 00:23

Ответ: Условие в задаче с интегралом
 
Цитата:

while true do //собственно условие на проверку точности
begin
xi:=dx*i;
xi1:=dx*(i+1);
h:=(xi1-xi)/4;
y0:=y(xi);
y1:=y(xi+h);
y2:=y(xi+2*h);
y3:=y(xi+3*h);
y4:=y(xi1);
inter:=(2*h/45)*(7*y0+32*y1+12*y2+32*y3+7*y4);
if(abs(inter)<E)exit
rez:=rez+inter;
end;
х3 как там на вашем паскале это синтаксически реализовано

pax 06.12.2010 01:32

Ответ: Условие в задаче с интегралом
 
Цитата:

Сообщение от impersonalis (Сообщение 171064)
х3 как там на вашем паскале это синтаксически реализовано

Проще тогда так:

PHP код:

repeat  
         xi
:=dx*i
         
xi1:=dx*(i+1); 
         
h:=(xi1-xi)/4
         
y0:=y(xi); 
         
y1:=y(xi+h); 
         
y2:=y(xi+2*h); 
         
y3:=y(xi+3*h); 
         
y4:=y(xi1); 
         
inter:=(2*h/45)*(7*y0+32*y1+12*y2+32*y3+7*y4); 
         
rez:=rez+inter
    
until(Abs(inter) <= E); 


impersonalis 06.12.2010 02:39

Ответ: Условие в задаче с интегралом
 
PHP код:

inter:=0
repeat   
         rez
:=rez+inter//<=========
         
xi:=dx*i;  
         
xi1:=dx*(i+1);  
         
h:=(xi1-xi)/4;  
         
y0:=y(xi);  
         
y1:=y(xi+h);  
         
y2:=y(xi+2*h);  
         
y3:=y(xi+3*h);  
         
y4:=y(xi1);  
         
inter:=(2*h/45)*(7*y0+32*y1+12*y2+32*y3+7*y4);  
         
//тут нельзя складывать - вдруг прирост уже и так меньше? тогда мы получим приближение лучше, чем заказывали
    
until(Abs(inter) <= E); 

тогда

pax 06.12.2010 17:09

Ответ: Условие в задаче с интегралом
 
Ну так на результирующую точность это ведь вроде не повлияет?

impersonalis 06.12.2010 18:37

Ответ: Условие в задаче с интегралом
 
повлияет: сначала загрязним результат, а лишь оптом проверим: надо ли было.


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot