@c Language: Brazilian Portuguese, Encoding: iso-8859-1
@c /romberg.texi/1.2/Sat Jun  2 00:13:30 2007//
@menu
* Fun@value{cedilha}@~{o}es e Vari@'{a}veis Definidas para romberg::
@end menu

@node Fun@value{cedilha}@~{o}es e Vari@'{a}veis Definidas para romberg, , Top, Top
@section Fun@value{cedilha}@~{o}es e Vari@'{a}veis Definidas para romberg

@deffn {Fun@value{cedilha}@~{a}o} romberg (@var{expr}, @var{x}, @var{a}, @var{b})
@deffnx {Fun@value{cedilha}@~{a}o} romberg (@var{F}, @var{a}, @var{b})

Calcula uma integra@value{cedilha}@~{a}o num@'{e}rica pelo m@'{e}todo de Romberg.

@code{romberg(@var{expr}, @var{x}, @var{a}, @var{b})}
retorna uma estimativa da integral @code{integrate(@var{expr}, @var{x}, @var{a}, @var{b})}.
@var{expr} deve ser uma express@~{a}o que avalie para um valor em ponto flutuante
quando @var{x} estiver associado a um valor em ponto flutuante.

@code{romberg(@var{F}, @var{a}, @var{b})}
retorna uma estimativa da integral @code{integrate(@var{F}(x), x, @var{a}, @var{b})}
onde @code{x} representa o n@~{a}o nomeado, isolado argumeno de @var{F};
o atual argumento n@~{a}o @'{e} chamado @code{x}.
@var{F} deve ser uma fun@value{cedilha}@~{a}o do Maxima ou do Lisp que retorne um valor em ponto flutuante
quando o argumento for um n@'{u}mero em ponto flutuante.
@var{F} pode nomear uma fun@value{cedilha}@~{a}o traduzida ou compilada do Maxima.

A precis@~{a}o de @code{romberg} @'{e} governada pelas vari@'{a}veis globais
@code{rombergabs} e @code{rombergtol}.
@code{romberg} termina com sucesso quando
a diferen@value{cedilha}a absoluta entre duas aproxima@value{cedilha}@~{o}es sucessivas for menor que @code{rombergabs},
ou a diferen@value{cedilha}a relativa em aproxima@value{cedilha}@~{o}es sucessivas for menor que @code{rombergtol}.
Dessa forma quando @code{rombergabs} for 0.0 (o padr@~{a}o)
somente o erro relativo tem algum efeito sobre @code{romberg}.

@code{romberg} divide ao meio o tamanho do passo no m@'{a}ximo @code{rombergit} vezes antes de interromper;
o n@'{u}mero m@'{a}ximo de avalia@value{cedilha}@~{o}es de fun@value{cedilha}@~{a}o @'{e} portanto @code{2^rombergit}.
Se o crit@'{e}rio de erro estabelecido por @code{rombergabs} e por @code{rombergtol}
n@~{a}o for satisfeito, @code{romberg} mostra uma mensagem de erro.
@code{romberg} sempre faz ao menos @code{rombergmin} itera@value{cedilha}@~{o}es;
isso @'{e} uma inten@value{cedilha}@~{a}o eur@'{i}sstica de previnir encerramentos esp@'{u}rios quando o integrando for oscilat@'{o}rio.

@code{romberg} repetidamente avalia o integrando ap@'{o}s associar a vari@'{a}vel
de integra@value{cedilha}@~{a}o a um valor espec@'{i}fico (e n@~{a}o antes).
Essa pol@'{i}tica de avalia@value{cedilha}@~{a}o torna poss@'{i}vel aninhar chamadas a @code{romberg},
para calcular integrais multidimensionais.
Todavia, os c@'{a}lculos de erro n@~{a}o tomam os erros de integra@value{cedilha}@~{o}es aninhadas
em considera@value{cedilha}@~{a}o, ent@~{a}o erros podem ser subestimados.
Tamb@'{e}m, m@'{e}todos imaginados especialmente para problemas multidimensionais podem retornar
a mesma precis@~{a}o com poucas avalia@value{cedilha}@~{o}es de fun@value{cedilha}@~{a}o.

@code{load(romberg)} torna essa fun@value{cedilha}@~{a}o dispon@'{i}vel para uso.

Veja tamb@'{e}m @code{QUADPACK}, uma cole@value{cedilha}@~{a}o de fun@value{cedilha}@~{o}es de integra@value{cedilha}@~{a}o num@'{e}rica.

Exemplos:

Uma integra@value{cedilha}@~{a}o unidimensonal.
@c ===beg===
@c load (romberg);
@c f(x) := 1/((x - 1)^2 + 1/100) + 1/((x - 2)^2 + 1/1000) + 1/((x - 3)^2 + 1/200);
@c rombergtol : 1e-6;
@c rombergit : 15;
@c estimate : romberg (f(x), x, -5, 5);
@c exact : integrate (f(x), x, -5, 5);
@c abs (estimate - exact) / exact, numer;
@c ===end===

@example
(%i1) load (romberg);
(%o1)    /usr/share/maxima/5.11.0/share/numeric/romberg.lisp
(%i2) f(x) := 1/((x - 1)^2 + 1/100) + 1/((x - 2)^2 + 1/1000) + 1/((x - 3)^2 + 1/200);
                    1                 1                1
(%o2) f(x) := -------------- + --------------- + --------------
                     2    1           2    1            2    1
              (x - 1)  + ---   (x - 2)  + ----   (x - 3)  + ---
                         100              1000              200
(%i3) rombergtol : 1e-6;
(%o3)                 9.9999999999999995E-7
(%i4) rombergit : 15;
(%o4)                          15
(%i5) estimate : romberg (f(x), x, -5, 5);
(%o5)                   173.6730736617464
(%i6) exact : integrate (f(x), x, -5, 5);
(%o6) 10 sqrt(10) atan(70 sqrt(10))
 + 10 sqrt(10) atan(30 sqrt(10)) + 10 sqrt(2) atan(80 sqrt(2))
 + 10 sqrt(2) atan(20 sqrt(2)) + 10 atan(60) + 10 atan(40)
(%i7) abs (estimate - exact) / exact, numer;
(%o7)                7.5527060865060088E-11
@end example

Uma integra@value{cedilha}@~{a}o bidimensional, implementada com chamadas aninhadas a @code{romberg}.
@c ===beg===
@c load (romberg);
@c g(x, y) := x*y / (x + y);
@c rombergtol : 1e-6;
@c estimate : romberg (romberg (g(x, y), y, 0, x/2), x, 1, 3);
@c assume (x > 0);
@c integrate (integrate (g(x, y), y, 0, x/2), x, 1, 3);
@c exact : radcan (%);
@c abs (estimate - exact) / exact, numer;
@c ===end===

@example
(%i1) load (romberg);
(%o1)    /usr/share/maxima/5.11.0/share/numeric/romberg.lisp
(%i2) g(x, y) := x*y / (x + y);
                                    x y
(%o2)                   g(x, y) := -----
                                   x + y
(%i3) rombergtol : 1e-6;
(%o3)                 9.9999999999999995E-7
(%i4) estimate : romberg (romberg (g(x, y), y, 0, x/2), x, 1, 3);
(%o4)                   0.81930239628356
(%i5) assume (x > 0);
(%o5)                        [x > 0]
(%i6) integrate (integrate (g(x, y), y, 0, x/2), x, 1, 3);
                                          3
                                    2 log(-) - 1
                    9                     2        9
(%o6)       - 9 log(-) + 9 log(3) + ------------ + -
                    2                    6         2
(%i7) exact : radcan (%);
                    26 log(3) - 26 log(2) - 13
(%o7)             - --------------------------
                                3
(%i8) abs (estimate - exact) / exact, numer;
(%o8)                1.3711979871851024E-10
@end example

@end deffn

@defvr {Vari@'{a}vel de op@value{cedilha}@~{a}o} rombergabs
Valor padr@~{a}o: 0.0

A precis@~{a}o de @code{romberg} @'{e} governada pelas vari@'{a}vies globais
@code{rombergabs} e @code{rombergtol}.
@code{romberg} termina com sucesso quando
a diferen@value{cedilha}a absoluta entre duas aproxima@value{cedilha}@~{o}es sucessivas for menor que @code{rombergabs},
ou a diferen@value{cedilha}a relativa em aproxima@value{cedilha}@~{o}es sucessivas for menor que @code{rombergtol}.
Dessa forma quando @code{rombergabs} for 0.0 (o padr@~{a}o)
somente o erro relativo tem algum efeito sobre @code{romberg}.

Veja tamb@'{e}m @code{rombergit} e @code{rombergmin}.

@end defvr

@defvr {Vari@'{a}vel de op@value{cedilha}@~{a}o} rombergit
Valor padr@~{a}o: 11

@code{romberg} divide ao meio o tamanho do passo no m@'{a}ximo @code{rombergit} vezes antes de interromper;
o n@'{u}mero m@'{a}ximo de avalia@value{cedilha}@~{o}es de fun@value{cedilha}@~{a}o @'{e} portanto @code{2^rombergit}.
@code{romberg} sempre faz ao menos @code{rombergmin} itera@value{cedilha}@~{o}es;
isso @'{e} uma inten@value{cedilha}@~{a}o eur@'{i}sstica de previnir encerramentos esp@'{u}rios quando o integrando for oscilat@'{o}rio.

Veja tamb@'{e}m @code{rombergabs} e @code{rombergtol}.

@end defvr

@defvr {Vari@'{a}vel de op@value{cedilha}@~{a}o} rombergmin
Valor padr@~{a}o: 0

@code{romberg} sempre faz ao menos @code{rombergmin} itera@value{cedilha}@~{o}es;
isso @'{e} uma inten@value{cedilha}@~{a}o eur@'{i}sstica para prevenir termina@value{cedilha}@~{o}es esp@'{u}rias quando o integrando for.

Veja tamb@'{e}m @code{rombergit}, @code{rombergabs}, e @code{rombergtol}.

@end defvr

@defvr {Vari@'{a}vel de op@value{cedilha}@~{a}o} rombergtol
Valor padr@~{a}o: 1e-4

A precis@~{a}o de @code{romberg} @'{e} governada pelas vari@'{a}veis globais
@code{rombergabs} e @code{rombergtol}.
@code{romberg} termina com sucesso quando
a diferen@value{cedilha}a absoluta entre duas aproxima@value{cedilha}@~{o}es sucessivas for menor que @code{rombergabs},
ou a diferen@value{cedilha}a relativa em aproxima@value{cedilha}@~{o}es sucessivas for menor que @code{rombergtol}.
Dessa forma quando @code{rombergabs} for 0.0 (o padr@~{a}o)
somente o erro relativo tem algum efeito sobre @code{romberg}.

Veja tamb@'{e}m @code{rombergit} e @code{rombergmin}.

@end defvr
