Matemática computacional
MEFT - Instituto Superior Técnico (IST)
João Cunha no 67921 Miguel Prata no 67933 Natália Morais no 67936
Trabalho de Casa com Componente Computacional No 26
19 de Novembro de 2010
Objectivos
Na primeira parte deste trabalho pretende-se:
1. Usar o método de Steffensen para calcular valores aproximados da solução z da equação f (x) = 0, onde f : I ⊂ R → R
é uma função continuamente diferenciável numa vizinhança da solução z, sendo aplicado este método, primeiramente
a uma função w que escolhemos e em segundo lugar à função f do exercı́cio [3d.2].
2. Usar o método de Newton generalizado para calcular um valor aproximado da solução z de um sistema de equações
f (x) = 0 onde F : D ⊂ Rd → Rd , d ≥ 2, é uma função continuamente diferenciável numa vizinhança de z. Usar o
método de eliminação de Gauss com pesquisa parcial de pivot para resolver o sistema linear que determina a diferença
de duas iteradas sucessivas do método de Newton. Um dos sistemas f é nos dado e outro é escolhido por nós (exercı́cio
[5a.7]).
1
1.1
Método de Steffensen
Note-se que as condições dadas por este teorema são suficientes mas não necessárias.
Introdução
Teorema 2. Seja z ponto fixo de g, suponha-se que g ∈ C 1
0
Existem vários métodos de cálculo de zeros de uma função. numa vizinhança de z e que |g (x)| < 1, então a sucessão
gerada por (2) converge para z e são válidas as conclusões do
Grande parte deles reduzem-se a considerar
Teorema 1 desde que x0 esteja suficientemente perto de z
z = g(z)
(1)
Há também mais um teorema que interessa referir para a
seguir
estudar o Método de Steffensen. Note-se que se tem
uma vez que g (a função iteradora) transforma z em si mesmo,
e
=
z
− xm e em+1 = z − xm+1 .
z é denominado ponto fixo de g e desta forma pode-se obter m
Teorema 3. Seja z um ponto fixo de g ∈ C p numa vizinhança de z e g (p) contı́nua nessa vizinhança. Seja ainda
o método que consiste em construir a sucessão x0 , x1 , x2 , ...
tal que
xm+1 = g(xm ), m ∈ N0
(2)
g 0 (z) = ... = g (p−1) (z) = 0
g (p) 6= 0
sendo este método apelidado de Método do Ponto Fixo.
Então para qualquer x0 suficientemente perto de z, a sucessão
O Método do ponto fixo possui naturalmente condições de
(2) converge para z e
convergência. Vejamos primeiro a seguinte definição:
(−1)(p+1) (p)
em+1
lim
=
g (z)
(5)
Definição 1. Uma função g diz-se Lipschitziana no intervalo
p
m→∞ em
p!
I = [a, b] se existir um constante L ≥ 0 tal que
e portanto a convergência é supralinear de ordem p e tem-se
|g(y) − g(x)| ≤ L|y − x|,
∀y, x ∈ I
(3) que o coeficiente assintótico de convergência K∞ = | g(p) (z) | .
p!
O Método de Steffensen pode tratar-se como um caso parNo caso em que L < 1 a função g diz-se contractiva. A L
ticular do método do ponto fixo já exposto. Pode-se escrever
chama-se constante de contractividade.
a forma iterativa do método de Steffensen como
Nas condições da definição anterior
[f (xm )]2
xm+1 = xm −
,m ∈ N
(6)
f (xm + f (xm )) − f (xm )
L = max |g 0 (x)|
(4)
x∈I
que se pode considerar um método de ponto fixo bastando
Sabendo isto pode-se agora analisar o teorema seguinte, escolher
[f (x)]2
que chamamos do ponto fixo.
g(x) = x −
(7)
f (x + f (x)) − f (x)
Teorema 1. Se existir um intervalo I = [a, b] no qual a
Desta forma, são válidas para este método, as condições
função g é contractiva e g(I) ⊂ I, i. e., a ≤ g(x) ≤ b, então: de convergência impostas à função g pelo Teorema 1.
Para estudar a ordem de convergência deste método va1. g possui pelos menos um ponto fixo z em I
mos reescrevê-lo como
2. z é o único ponto fixo em I
[f (x)]2
F (x) = x −
(8)
f (x + f (x)) − f (x)
3. para qualquer x0 em I a sucessão xm gerada por (2)
converge para z
Note-se que xm , f (xm ) e f (f (xm )) são 3 iteradas consecutivas
de um método iterativo cuja função iteradora é
1
|xm+1 − xm | ,
4. |z − xm | ≤ 1−L
f
.
Se
f
∈
C 1 numa vizinhança de z, pode-se verificar que
L
|z − xm+1 | ≤ 1−L |xm+1 − xm |
limx→z F (x) = z e portanto podemos definir por continuidade
F
em z escrevendo F (z) = z. Se f 0 (z) 6= 1 então F 0 (z) = 0, e
Lm
5. |z − xm | ≤ Lm |z − x0 | ≤ 1−L
|x1 − x0 |
portanto a convergência do método de Steffesen é pelo menos
1
quadrática (pelo Teorema 3). Note-se que para f 0 (x) = 0 não
se deve aplicar o método, pois conduz a um enorme número
de iteradas.
Verifica-se, em comparação com o método do ponto fixo,
uma aceleração da convergência do método do ponto fixo
quando a primeira derivada da função iteradora é diferente de
zero (o método iterativo original converge linearmente, p = 1,
ou não converge). Se a primeira derivada da função iteradora
é zero, então (pelo Teorema 3) o método tem convergência
supralinear (p > 1).
Conclui-se assim que, em termos da expressão (7), o
método de Steffensen, tendo em conta os Teoremas 1 e 2,
converge quadraticamente (p = 2) para |g 0 (z)| < 1 (tendo
em atenção que para o caso de g 0 (z) = 0 não se deve aplicar
este método) e converge linearmente (p=1) quando g 0 (z) = 1.
Tem-se também (do Teorema 3) um coeficiente assintótico
00 g (z) (9)
K∞ = 2! de modo a que o novo subintervalo contenha um zero de f ; se
pelo contrário forem f (bm ) e f (xm+1 ) a ter sinais diferentes
então faça-se
am+1 = xm+1
1.2.1
bm+1 = bm
Deste modo garante-se que o novo subintervalo Im+1 =
[am+1 , bm+1 ] contém pelo menos um zero de f .
No ciclo (ver CICLO1, no código steffensen.cpp) de
cálculo relativo à determinação do subintervalo final é utilizada a condição de paragem bm − am < 0.01, ou seja,
consegue-se assim um intervalo (que é impresso, para informação do utilizador) suficientemente pequeno em que se
vai aplicar o Método de Steffensen.
Assim, fazendo, por exemplo, x0 = bm aplica-se o método
de Steffensen já exposto. O ciclo (ver CICLO2, no código
steffensen.cpp) de aplicação do método de Steffensen imprime a iteração, o xm , o em ”exacto”e em estimado, os valores da sucessão |em |/|em−1 |2 e ainda uma estimativa de g 0 .
Utilizando as conclusões do Teorema 1 pode-se concluir
que é admissı́vel a estimativa
xm+1 − xm
(12)
g 0 (xm ) ≈
xm − xm−1
(Pode ainda convergir para |g 0 (x)| > 1, sendo que assim, g
não é contractiva)
1.2
e
, possı́vel quando m ∈ N0 : m ≥ 2 e do mesmo teorema
pode-se concluir também que para o caso de convergência
supralinear (caso do Método de Steffensen)
Aplicação do método
Programa steffensen.cpp
|em | ≈ |xm+1 − xm | e
Em resposta ao TCCC foi desenvolvido o programa steffensen.cpp (ver Anexo 1 e 2) escrito na linguagem de programação conhecida por C++.
Para compilar e executar o programa aconselha-se a
utilização do sistema operativo Windows com o programa
Dev-cpp da Bloodshed disponı́vel para download no link
http://sourceforge.net/projects/dev-cpp/files/Binaries/DevC%2B%2B%204.9.9.2/devcpp-4.9.9.2 setup.exe/download .
O programa pretende aplicar o método de Steffensen num
intervalo I = [a, b] fornecido pelo utilizador do programa.
Depois de inserido o intervalo o programa verifica se existe mais que um zero (da função f ) nesse intervalo e verifica se f (a)f (b) > 0, condição na qual não se pode aplicar
o Corolário do Teorema de Bolzano o que não garante a existência de zero nesse intervalo. Caso se verifique uma das
duas situações anteriores o programa é encerrado.
Caso contrário o programa tenta encontrar um novo intervalo I 0 que verifique as condições de convergência do Teorema
1. Para isso aplica-se o método da bissecção à função f no
intervalo I.
O método da bissecção aplica-se a uma função que verifique as condições do Corolário do Teorema de Bolzano (f
é contı́nua em I e f (a)f (b) < 0). Consiste em construir
subintervalos Im = [am , bm ] ⊂ I = [a, b] por divisões sucessivas a meio e relativamente aos quais também se verifica que
f (am )f (bm ) < 0. Deste modo, confina-se o zero da função
f a intervalos tão pequenos quanto se queira. Concretizando
tem-se
Im = [am , bm ] m = 0, 1, 2, . . .
(10)
|em+1 | |xm+1 − xm |
(13)
00
Tira-se também de (8) que K∞ = | g 2!(z) |, o que se pode
verificar observando a convergência da sucessão |em |/|em−1 |2 .
Durante o ciclo são recolhidos dados para avaliar as
condições suficientes de convergência exigidas pelo Teorema
1. Se alguma não se verificar no final do ciclo o utilizador
é informado. Como essas condições são apenas suficientes e
não necessárias apresenta-se sempre a tabela para que outras
conclusões possam ser retiradas. O critério de paragem é tal
que |xm − xm−1 | < sendo dado.
Caso o método não convirja em 1000 iteradas é apresentada essa informação.
No final do ciclo é apresentado o resultado encontrado para o zero, assim como a informação do coeficiente
assintótico de convergência.
Menciona-se a utilização de uma particular função externa
à função principal main, a função quicksort. O seu objectivo
é ordenar por ordem crescente os componentes do vector g_d
que se traduz nos valores de |g 0 (xm )|. Desda forma, conseguese identificar L = maxx∈I 0 |g 0 (x)|, como sendo o último elemento do vector g_d. Avalia-se assim se g é contractiva.
Outras funções externas à função principal main têm o
seguinte objectivo: a função f retorna o valor de f num determinado ponto dado como argumento; f_d retorna a derivada
de f num determinado ponto dado como argumento; f_d2 retorna a segunda derivada de f num determinado ponto dado
como argumento.
Informação referentes a comandos próprios da linguagem
C++ encontram-se nos comentários ao código.
em que a0 = a e b0 = b e seja xm+1 o ponto médio do intervalo
Im , i. e.,
1.2.2 Função [3d.2]
am + bm
xm+1 =
(11)
Neste TCCC pretendia-se aplicar o método exposto à
2
função
2
Considera-se então 3 situações: se f (xm+1 ) = 0 então
f (x) = ex −1 + 10 sin(2x) − 5
(14)
xm+1 é um zero e o processo iterativo termina; se f (am ) e
que
se
trata
de
uma
equação
transcendente.
f (xm+1 ) tiverem sinais diferentes faça-se
Para averiguar a posição dos zeros, fez-se uma repream+1 = am e bm+1 = xm+1
sentação gráfica da função f que se pode observar a seguir
2
método, a imagem dos extremos são de sinais diferentes e a
f é monótona crescente/decrescente nesse intervalo.
Outras análises
prendem-se com a comparação
ao output
em entre a sucessão em−1 2 e o valor de K∞ , tal não se verifica
novamente devido a erros de arredondamento.
1.3
Através da informação dos Outputs, do conhecimento
teórico e do conhecimento adquirido na produção do programa, podem-se concluir algumas vantagens/desvantagens
em relação ao Método de Steffensen.
Do lado das vantagens insere-se a rapidez de convergência,
visto que o método converge muito rapidamente sendo
necessárias poucas iteradas; em comparação com outros
métodos tais como o método de Newton ganha vantagem uma
vez que tem uma ordem de convergência similar e não necessita de qualquer informação acerca da derivada da função.
Do lado das desvantagens inserem-se o tempo de computação para funções f complicadas que é elevado, principalmente devido ao termo f (x + f (x)); e a principal desvantagem é o facto do intervalo de convergência local ser bastante
reduzido, sendo necessário inserir um x0 muito próximo do
zero z, caso contrário o método não converge para a solução.
Quanto a este último assunto verifica-se que o método converge mais rapidamente quanto mais perto estiver x0 da
solução z, i. e., é necessário um menor número de iteradas.
Gráfico 1: Representação gráfica da função f
obtém-se da representação gráfica os zeros
z1
z2
z3
z4
= −1.59019078359636 . . .
= 0.2395826576263948 . . .
= 1.489630021514447 . . .
= 1.801987287952526 . . .
Note-se que a função f é contı́nua pois é a soma de funções
contı́nuas, a primeira a composição de uma exponencial com
uma quadrática (contı́nua em R), a segunda uma função
trigonométrica (contı́nua em R) e a última uma função constante.
Desta forma, o Corolário do Teorema de Bolzano garante a
existência de pelo menos um zero de f num intervalo I = [a, b]
em que f (a)f (b) < 0. Se para além disso se verificar que f 0
existe, é contı́nua e não se anula em (a, b) conclui-se, pelo 1.4
Teorema de Rolle que a solução z é única em (a, b).
Note-se também que f é de classe C ∞ em R pois é a soma
de duas funções de classe C ∞ em R.
1.4.1
1.2.3
Conclusões
Aplicação na resolução de um problema
de Fı́sica
Problema
Para aplicação do método a um problema de fı́sica, foi
enunciado o seguinte:
Análise de output
Para analisar os resultados do programa, escolheu-se
primeiro uma função w(x) =√x2 − 2. Verifica-se analiticamente que w(x) = 0 ⇒ x = ± 2 ≈ ±1.41421.
Analisemos os seguintes outputs presentes no Anexo 1.
Repare-se que e_m1 é a estimativa do erro obtida pela estimativa (13) e e_m2 é o erro. Pode observar-se nos outputs
o que foi deduzido teoricamente.
Os resultados obtidos coincidem, tendo em conta precisão da máquina, com os resultados analı́ticos. A precisão
da máquina dita também a máxima precisão do resultado e
sendo que em C++ só é possı́vel obter resultados com no
máximo 6 casas decimais, é considerada a condição de paragem |xm+1 − xm| < 1E − 6.
em Nota-se também que a sucessão em−1
2 converge para
algo similar a K∞ , o facto dos valores diferirem substancialmente deve-se a erros de arredondamento.
Problema 1. Uma partı́cula desloca-se num espaço a 3 dimensões numa trajectória definida pela função P (t) :]0, 4π[→
R3 , que descreve num referencial cartesiano Oxyz as posições
da partı́cula em função do tempo t. A função P (t) é dada por:
P (t) = (x(t), y(t), z(t)) =
t
t
t
cos (t), 2 + cos
cos (t), sin
=
2 + cos
2
2
2
(15)
Em que x(t) :]0, 4π[→ R, y(t) :]0, 4π[→ R e z(t) :]0, 4π[→
R.
A trajectória da partı́cula pode ser ilustrada pelo seguinte
gráfico:
Analise-se agora o output do programa para o caso de f .
Podem apreciar-se os outputs presentes no Anexo 2.
Nos Outputs 3,4,5 e 6 observa-se o output para cada um
dos zeros da função f e que estão coerentes com os zeros
encontrados geometricamente. Nos Outputs 7 e 8 observamse situações em que o programa identifica mais que um zero
no intervalo ou não existe zero nesse intervalo (podem ser
observados intervalos nessa situação quando considerando o
gráfico1).
Embora não tenha sido feito até agora pode-se confirmar
que no intervalo que o programa encontra para aplicação do
Grafico 2: Gráfico das posições da partı́cula no referencial Oxyz
3
Determine os extremos de posição para cada função x(t), modo similar ao exemplos anteriores. Vai-se tentar por isso
y(t) e z(t), ou seja as coordenadas x, y e z máximas e aplicar o método de Steffensen para encontrar os zeros das
mı́nimas da trajectória da partı́cula.
funções x0 (t), y 0 (t) e z 0 (t).
1.4.2
Resolução
1.4.3
Sabe-se que os máximos e mı́nimos de uma função de
I → R em que I ⊂ R correspondem aos zeros da sua derivada,
se a função for diferenciável.
t
2 é uma função diferenciável em R, pois é o produto de
1
duas funções
diferenciáveis em R, t e 2 .
t
cos 2 é uma função diferenciável em R pois é a composta
t
de duas funções
diferenciáveis em R, cos (t) e 2 .
t
2 + cos 2 é diferenciável em R,
pois é a soma de duas
funções diferenciáveis
em R, cos 2t e uma função constante.
x(t) = 2 + cos 2t cos (t) é uma função diferenciável em
R, pois é o produto de duas funções diferenciáveis em R,
2 + cos 2t e cos (t), logo a função x(t) é diferenciável no
intervalo ]0, 4π[ em particular.
y(t) = 2 + cos 2t sin (t) é uma função diferenciável em
R, pois é o produto de duas funções diferenciáveis em R,
2 + cos 2t e sin (t), logo a função y(t) é diferenciável no intervalo ]0, 4π[ em particular.
z(t) = sin 2t é uma função diferenciável em R, pois é a
composta de duas funções diferenciáveis em R, sin t e 2t , logo
a função z(t) é diferenciável no intervalo ]0, 4π[ em particular.
Analogamente, verifica-se que as três funções são de classe
C ∞.
Pode-se então calcular a derivada de cada uma das funções
x(t), y(t) e z(t).
O programa steffensen aplicacao.cpp é semelhante ao das
alı́neas anteriores, tendo sido adaptado para a resolução do
problema em questão. As diferenças mais significativas são
as seguintes:
A função pos é a função das posições da partı́cula, sendo
a função vel a velocidade, dvel a primeira derivada da velocidade e *dvel a segunda derivada da mesma.
A função graf escreve no ficheiro ”trajectoria.txt”, as coordenadas x, y e z em cada instante t com dt =h=0.001 e desenha os gráficos da trajectória da partı́cula (Figura 1) e das
velocidades segundo os eixos x, y e z (Figura 2), já mostrados
acima.
A função steffensen aplica o método de Steffensen às
funções x0 (t), y 0 (t) ou z 0 (t), como já foi descrito nas alı́neas
anteriores.
Na função main é chamada a função graf para desenhar
os gráficos já falados. pergunta-se ao utilizador se pretende
encontrar os extremos das posições no eixos dos x’s, y ou z
e consoante a escolha, é chamada a função steffensen para
aplicar o método.
Mais informação sobre o código do programa encontra-se
nos comentários ao código.
1.4.4
t
t
cos (t) − sin (t) cos
+2
2
2
t
t
1
sin (t) + cos (t) cos
+2
y 0 (t) = − sin
2
2
2
t
1
z 0 (t) = cos
2
2
1
x0 (t) = − sin
2
Que são representadas no seguinte gráfico:
Os outputs correspondentes ao programa steffensen aplicacao.cpp encontram-se no Anexo 3 (Outputs 9
a 18).
(17)
Verifica-se que os zeros encontrados estão de acordo com
os previstos, com precisão até à sexta casa decimal. (Outputs
(18) 9 a 17)
em A sucessão em−1
2 converge para K∞ (tendo em conta os
erros de arredondamento).
Repare-se também que a derivada da função g, respeita
sempre a condição |g 0 (x)| < 1 ∀x ∈ I, sendo I um intervalo
válido fornecido pelo utilizador.
O Output 18 corresponde a uma situação em que existe
mais do que um zero no intervalo, tendo sido dado erro pelo
programa.
Grafico 3: Gráfico das velocidades da partı́cula em x, y e zem função
do tempo
= 1.4506848...
= 4.4342238...
= 8.1321468...
= 11.115686...
Método de Newton Generalizado e
Eliminação de Gauss com pesquisa
parcial de pivot
2.1
Analizando os gráficos do Gráfico 3, verifica-se que no intervalo pretendido, x0 (t) tem 3 zeros, y 0 (t) 4 zeros e z 0 (t) 2
zeros, sendo estes:
y1
y2
y3
y4
Resultados e análise
(16)
2
x1 = 2.9109431...
x2 = 6.2831853... = 2π
x3 = 9.6554275...
Programa steffensen aplicacao.cpp
2.1.1
Introdução
Método de Newton Generalizado
Consideremos um sistema de equações não lineares do
z1 = 3.1415927... = π
z2 = 9.4247780... = 3πtipo:

2

x1 + 3 sin x2 = 4
x41 − 6x21 x22 + x43 = −1


x1 x2 x3 − x21 + x32 = 2
Já vimos que a todas as funções são diferenciáveis no intervalo ]0, 4π[, sendo consequentemente constı́nuas nesse intevalo, podendo assim ser aplicado o Teorema de Bolzano de
4
(19)
(iii) sendo 0 = 2kx(1) − x(0) k e K =
sigualdade 2K0 < 1;
Podemos definir:

2

f1 (x1 , x2 , x3 ) = x1 + 3 sin x2 − 4
f2 (x1 , x2 , x3 ) = x41 − 6x21 x22 + x43 + 1


f3 (x1 , x2 , x3 ) = x1 x2 x3 − x21 + x32 − 2
M2
2M1 ,
verifica-se a de-
(0)
(20) (iv) B0 (x ) ⊂ D
Então conclui-se
Visto que as equações são não lineares, não é possı́vel escrever
o sistema em notação matricial. Contudo, é possı́vel fazê-lo
em notação vectorial:


f1 (x1 , x2 , x3 )
F (x1 , x2 , x3 ) =  f2 (x1 , x2 , x3 ) 
(21)
f3 (x1 , x2 , x3 )
1. f tem um único zero z em B0 (x(0) )
2. a sucessão de Newton com condição inicial x(0) é bem
definida, permanece em B0 (x(0) ) converge para z
3. verifica-se a estimativa de erro a priori
1
kz − x(m) k ≤ (K0 )2m
Podemos assim, exprimir o sistema não linear como a
K
equação F (x1 , x2 , x3 ) = 0 (sendo 0 o vector nulo).
Assim, o Teorema de Kantorovich garante-nos a conPara a resolver desejamos aplicar o método de Newton
vergência do Método de Newton Generalizado para algum
Generalizado.
O método iterativo de Newton é utilizado para calular x(0) . Pode-se mostrar, que, para f de classe C 2 numa vizinhança do zero z, tal que det(Jf (z)) 6= 0. Então o método
zeros de funções de uma variável e é dado por:
de Newton converge para z desde que x(0) esteja suficientef (xn )
, n∈N
(22) mente perto de z, ou seja, garante-se a convergência local do
xn+1 = xn − 0
f (xn )
método.
Pode-se também obter a proposição seguinte
Sejam F = [f1 , f2 , . . . , fn ] e X = [x1 , x2 , . . . , xn ] vectores
de dimensão n. Para aplicar o método de Newton à equação
Proposição 5. Seja f ∈ C 2 (Vz ), onde Vz é uma vizinhança
F (X) = 0 podemos começar por escrever:
de z, zero de f , tal que det(Jf (z)) 6= 0. Então o método
de Newton, quando converge para z, tem convergência pelo
(n)
F (X )
X (n+1) = X (n) − 0 (n)
(23) menos quadrática, i. e., existe K > 0 tal que
F (X )
kz − x(m+1) k ≤ Kkz − x(m) k2 ,
Com



0
F (x1 , x2 , . . . , xn ) = 


∂f1
∂x1
∂f2
∂x1
∂f1
∂x2
∂fn
∂x1
...
...
...
...
..
.
∂f1
∂xn
∂f2
∂xn
..
.
...
∂fn
∂xn






ou
kz − x(m) k ≤
(24)
m∈N
1
(Kkz − x(0) k)2m
K
A proposição anterior garante-nos que o método converge
pelo menos quadraticamente.
Dado que F 0 (X) é uma matriz, mais concretamente a ma2.1.2 Eliminação de Gauss
triz Jacobiana, J(X), do sistema, a equação 23 toma a forma:
O método de eliminação de Gauss permite resolver sisX (n+1) = X (n) − F (X (n) )[J(X (n) )]−1
(25) temas de equações lineares através da sucessiva eliminação
de incógnitas.
Contudo, inverter uma matriz é computacionalmente
Considerando um sistema Ax = b eliminam-se sucessivaproblemático e trabalhoso, pelo que rearranjando a equação
mente
incógnitas de modo a obter um sistema equivalente
25 se obtém o método de Newton generalizado:
U x = g, sendo U uma matriz triagular superior.
J(X (n) )∆X (n) = −F (X (n) )
(26)
Designemos o sistema original por A(1) x = b(1) , e o siscom
tema após o passo κ da eliminação de Gauss por A(κ) x = b(κ) .
X (n+1) = X (n) + ∆X (n)
(27)
Supunhamos que a11 6= 0. Devemos obter coeficientes
m
i1 tal que as entradas a21 a an1 sejam nulas quando lhes
Partindo de pontos iniciais x0 , x1 , ..., xn , a equação 26
for
subtraı́da a primeira equação multiplicada por mi1 . Os
é uma equação linear, podendo ser resolvida utilizando o
coeficientes
mi1 são dados por:
método de eliminação de Gauss com pesquisa parcial de pivot,
de modo a encontrar ∆X. Iterando ambas as equações obtemos aproximações cada vez melhores da solução, devendo este
processo parar quando ∆X < p, sendo p a precisão desejada.
Repare-se agora no seguinte teorema suficiente de convergência do método, apelidado de Teorema de Kantorovich.
mi1 =
(2)
(1)
(1)
aij = aij − mi1 aij
(29)
É também necessário actualizar as entradas do vector b:
(2)
bi
1
M1 ,
(28)
E as novas entradas por:
Teorema 4. Seja D ⊂ Rn um conjunto aberto convexo e
f ∈ C 1 (D). Suponha-se que para alguma norma em Rn e
algum x(0) ∈ D são verificadas as condições
(i) det(Jf (x)) 6= 0, ∀x ∈ D;
−1
∃M1 > 0 : k [Jf (x)] k ≤
a1i1
a111
∀x ∈ D;
(1)
= bi
Com i = 2, . . . , n e j = 1, . . . , n.
(ii) ∃M2 > 0 : kJf (x) − Jf (y)k ≤ M2 kx − yk, ∀x, y ∈ D;
5
(1)
− mi1 b1
(30)
Assim, num passo κ, tal que 1 6 κ 6 n − 1 e supondo que
aκκ =
6 0 (elemento pivot):
2.2.2
Função [5a.7]
O sistema de equações não lineares a resolver é:
(κ)
miκ =
aiκ
(31)
(κ)

2

xy − z + 3 = 0
xyz − x2 + y 2 − 2 = 0

 x
e − ey + z − 3 = 0
aκκ
(κ)
(κ)
aκ+1
= aij − miκ aκj
ij
(32)
bκ+1
= bκi − miκ b(κ)
κ
i
(33)
(36)
Com uma matriz J:
Com: i = j = k + 1, . . . , n

y
 yz − 2x
ex
Pesquisa Parcial de Pivot
x
xz + 2y
−ey

−2z
xy 
1
(37)
A pesquisa parcial de pivot num dado passo κ da eliminação de Gauss tem como objectivo evitar as divisões por
As soluções exactas foram determinadas utilizando
0 e também por números muito pequenos que desiquilibrem
o software Wolfram Alpha disponı́vel em http://www.
a matriz devido a erros de arredondamento, devido ao facto
wolframalpha.com/ sendo estas (ver Figura 1 no Anexo 4):
dos coeficientes m serem muito grandes (note-se que quando
o pivot → 0, m → ∞).
x = 1.29279
Assim, num dado passo κ da eliminação de Gauss devemos
encontrar o máximo absoluto numa dada coluna κ e trocar
a linha desta entrada com a linha κ, fazendo o mesmo às
y = 0.998577
mesmas linhas de x e b.
z = 2.07146
Resolução do sistema triangular
Estando o sistema transformado na forma U x = g sendo
este é facilmente resolúvel por subsituição ascendente:
gn
unn nn
Pn
(gκ − j=κ+1 ukj xj )
xn =
xk =
uκκ
Com os pontos iniciais:
(34)
x0 = 1
(35)
y0 = 1.5
z0 = 2
Com κ = n − 1, n − 2, ..., 1
2.2
2.2.1
Aplicação do método
2.2.3
Função escolhida
Programa newtongeneralizado.c
Modificámos o código do programa newtongeneralizado.c
O programa escrito para resolver sistemas de equações não de modo a que resolvesse o seguinte sistema de equações não
lineares foi escrito em linguagem C, podendo ser compilado e lineares escolhido por nós:
e executado com software apropriado (como o Dev-C++).
Primeiro são pedidos ao utilizador os pontos iniciais
(
10x2 + sin y − 20 = 0
x1 , x2 , . . . , xn .
(38)
É então inicializado um vector b e uma matriz A, ambos
x4 + 5y − 6 = 0
de dimensão n, que servirão, respectivamente, para guardar
a matriz Jacobiana e o vector F (X).
Com uma matriz J:
É agora possı́vel começar o método de Newton, utilizando
os pontos x1 , x2 , . . . , xn dados pelo utilizador.
20x cos y
Após esta etapa o programa inicia um ciclo de modo a
(39)
4x3
5
iterar sucessivamente as equações 26 e 27.
Para resolver 26 são utilizadas as funções externas
E soluções exactas (ver Figura 2):
forward_elim e solve.
A função forward_elim aplica eliminação de Gauss com
pesquisa parcial de pivot ao sistema. E a função solve resolve
x = 1.39929
o sistema por substituição ascendente.
As soluções deste sistema são ∆x1 , ∆x2 , . . . , ∆xn , que são
y = 0.433232
utilizados na equação 27.
Se a condição ∆X < 1 × 10−6 for satisfeita o ciclo é inCom os pontos iniciais:
terrompido e o programa acaba. A cada ciclo são impressos
no ecrã os valores de x1 , x2 , . . . , xn , ||X (κ) − X (κ−1) ||, ||e(κ) ||
x0 = 1
e(κ)
e || e(κ−1)
||. O erro e(κ) é dado pela maior diferença entre as
soluções exactas e as respectivas soluções determinadas nuy0 = 1
mericamente.
6
2.2.4
Análise de resultados e Conclusões
Verificámos que quanto mais próximos da solução estiverem os pontos iniciais mais rápida é a convergência.
Para analisar os resultados devemos comparar as soluções
obtidas com as consideradas exactas (ver Output 19 e 20).
O programa estima com uma precisão bastante elevada a
solução, desde que tal como foi visto no Teorema 4, os pontos iniciais estejam numa vizinhança relativamente perto da
solução. Caso contrário, surgem resultados inesperados.
O output do programa newtongeneralizado.c mostra
uma convergência após 8 iterações. Note-se que os pontos
iniciais utilizados são diferentes dos que foram utilizados no
Wolfram, contudo a solução obtida é a mesma.
3
3.1
No programa newtongeneralizado2.c são utilizados os
mesmos pontos iniciais que no Wolfram e verifica-se a convergência após 4 iteradas. Note-se que o erro e(κ) da última
iteração deste programa é menor que o do anterior. Isto pode
estar relacionado com o os erros de arredondamento introduzidos pelo método de eleminação de Gauss com pesquisa parcial
de pivot serem maiores no programa newtongeneralizado.c,
pois a matriz Jacobiana é de dimensão 3 × 3 enquanto que em
newtongeneralizado2.c a Jacobiana é uma matriz 2 × 2.
Anexos
Anexo 1
Output 5: Output do programa steffensen.cpp
Output 1: Output do programa steffensen_sqrt2.cpp
Output 6: Output do programa steffensen.cpp
Output 2: Output do programa steffensen_sqrt2.cpp
Output 7: Output do programa steffensen.cpp
3.2
Anexo 2
Output 8: Output do programa steffensen.cpp
3.3
Anexo 3
Output 3: Output do programa steffensen.cpp
Output 9: Output do programa steffensen_aplicacao.cpp
Output 4: Output do programa steffensen.cpp
7
Output 10: Output do programa steffensen_aplicacao.cpp
Output 14: Output do programa steffensen_aplicacao.cpp
Output 15: Output do programa steffensen_aplicacao.cpp
Output 11: Output do programa steffensen_aplicacao.cpp
Output 16: Output do programa steffensen_aplicacao.cpp
Output 12: Output do programa steffensen_aplicacao.cpp
Output 17: Output do programa steffensen_aplicacao.cpp
Output 13: Output do programa steffensen_aplicacao.cpp
Output 18: Output do programa steffensen_aplicacao.cpp
8
3.4
Anexo 4
Figura 1: Resultados obtidos para o sistema 36
Figura 2: Resultados obtidos para o sistema 38
Output 19: Resultados obtidos para o sistema 36 com o programa desenvolvido
Output 20: Resultados obtidos para o sistema 38 com o programa desenvolvido
9
3.5
3.5.1
Códigos dos programas
steffensen.cpp
1 /∗PROG QUE APLICA O METODO DE STEFFENSEN∗/
/∗IST , MEFT, MC 2010 ∗/
3 /∗JOAO CUNHA 67921 , NATALIA MORAIS 67936 , MIGUEL PRATA 67933 ∗/
5 #include <i o s t r e a m >
#include <cmath>
7 #include <c s t d l i b >
// h e a d e r que p o s s u i f u n ç o e s de i n p u t / o u t p u t
// h e a d e r que p o s s u i f u n ç o e s s t a n d a r t
// h e a d e r com f u n ç o e s matematicas
9 using namespace s t d ; // namespace com informaçao de f u n ç o e s
11 /∗ f u n ç a o f que r e t o r n a o v a l o r da f u n ç a o para um d et er mi n ad o ponto x dado
como argumento ∗/
13 double f ( double x )
{ return ( exp ( x∗x −1) + 10∗ s i n ( 2 ∗ x ) −5) ; }
15
/∗ f u n ç a o f d que r e t o r n a o v a l o r da p r i m e i r a d e r i v a d a de f para um
17 determi n ad o ponto x dado como argumento ∗/
double f d ( double x )
19
{ return ( 2 ∗ exp ( x∗x−1) ∗x+20 ∗ c o s ( 2 ∗ x ) ) ; }
21 /∗ f u n ç a o f d 2 que r e t o r n a o v a l o r da p r i m e i r a d e r i v a d a de f para um
determi n ad o ponto x dado como argumento ∗/
23 double f d 2 ( double x )
{ return ( 4 ∗ exp ( x∗x−1) ∗x∗x+2 ∗ exp ( x∗x−1)−40 ∗ s i n ( 2 ∗x ) ) ; }
25
/∗ f u n ç a o t r o c a v a l o r e s que t r o c a d o i s e l e m e n t o s de um v e c t o r , r e c e b e n d o
27 como argumentos p o n t e i r o s para os e l e m e n t o s do v e c t o r ∗/
void t r o c a v a l o r e s ( double ∗n1 , double ∗n2 )
29 {
double i 1 ;
31
i 1 = ( ∗ n1 ) ;
33
( ∗ n1 ) = ( ∗ n2 ) ;
( ∗ n2 ) = i 1 ;
35 }
37 /∗ f u n ç a o q u i c k s o r t que ordena por ordem c r e c e n t e os e l e m e n t o s de um
v e c t o r r1 dado como argumento e os e l e m e n t o s i n i c i a l e f i n a l do v e c t o r ∗/
39 void q u i c k s o r t ( double ∗ r 1
, int e s q , int d i r )
{
41
int i , j , m ;
double rm ;
43
i = esq ;
45
j = dir ;
m = ( esq + d i r ) / 2 ;
47
rm = r 1 [m] ;
while ( i <= j )
49
{
while ( r 1 [ i ] < rm) ++i ;
51
while (rm < r 1 [ j ] ) −−j ;
i f ( i <= j )
53
{
t r o c a v a l o r e s (& r 1 [ i ] , &r 1 [ j ] ) ;
55
++i ;
−−j ;
57
}
}
59
i f ( e s q < j ) q u i c k s o r t ( r1 , esq , j ) ;
i f ( i < d i r ) q u i c k s o r t ( r1 , i , d i r ) ;
61 }
10
63 //−−−−−−−−−−−−−−−−−−−−−−−−−−−FUNÇAO PRINCIPAL MAIN−−−−−−−−−−−−−−−−−−−−−−−−−−−
int main ( )
65
{
// i n i c i a l i z a ç a o de v a r i a v e i s u t i l i z a d a s no programa
67
/∗NOTA: ’ d o u b l e ’ i n d i c a que a v a r i a v e i s s u p o r t a p r e c i s a o d u p l a
(6 a l g a r i s m o s s i g n i f i c a t i v o s / 6 c a s a d e c i m a i s ;
69
’ i n t ’ i n d i c a que a v a r i a v e l é um i n t e i r o ∗/
double c =0, f d c =0, x m , z , k , s s , a m , b m ;
71
int m;
73
75
77
79
// v a l o r dos z e r o s da f u n ç ã o f c o n h e c i d o s g e o m e t r i c a m e n t e
double z1= −1.590190783596;
double z2= 0 . 2 3 9 5 8 2 6 5 7 6 2 6 3 9 4 ;
double z3= 1 . 4 8 9 6 3 0 0 2 1 5 1 4 4 ;
double z4= 1 . 8 0 1 9 8 7 2 8 7 9 5 2 5 2 ;
// i n i c i a l i z a ç a o de v e c t o r e s de 1000 e l e m e n t o s cada
double g d [ 1 0 0 0 ] , x [ 1 0 0 0 ] , e m [ 1 0 0 0 ] , ex m [ 1 0 0 0 ] ;
81
83
/∗NOTA: O comando ’ c o u t ’ imprime no ecran ; o comando ’ e n d l ’ l im p a
o b u f f e r e c o l o c a p a s s a a proxima l i n h a ∗/
c o u t << ”\tMETODO DE STEFFENSEN” << e n d l << e n d l ;
85
87
89
// l e r os v a l o r e s a m e b m do t e c l a d o
c o u t << ” I n s i r a o extremo ’ a ’ do i n t e r v a l o I =[a , b ] : ” ;
c i n >> a m ;
/∗NOTA: ’ c i n ’ p e r m i t e r e c e b e r a informaçao do t e c l a d o e g u a r d a r numa
v a r i a v e l j a i n i c i a l i z a d a ∗/
91
93
95
97
99
101
103
105
107
109
111
113
c o u t << ” I n s i r a o extremo ’ b ’ do i n t e r v a l o I =[a , b ] : ” ;
c i n >> b m ;
/∗NOTA: ’ i f ’ é um comando c o n d i c i o n a l que e f e c t u a a i n s t r u ç a o s e a c o n d i ç a o
s e f o r v e r d a d e i r a ∗/
// v e r i f i c a q u a n t o s z e r o s tem no i n t e r v a l o
i f ( z1<b m && z1>a m ) { z = z1 ;
f d c ++;}
i f ( z2<b m && z2>a m ) { z = z2 ; f d c ++;}
i f ( z3<b m && z3>a m ) { z = z3 ; f d c ++;}
i f ( z4<b m && z4>a m ) { z = z4 ; f d c ++;}
// s e e x i s t i r e m mais que um z er o , ou f ( a m ) ∗ f ( b m )>0 imprime e s a i
// s e nao c o n t i n u a a c o r r e r o programa
i f ( f ( a m ) ∗ f ( b m )>0 | | f d c >1)
{
c o u t << e n d l ;
c o u t << ”ATENCAO! Nao s e pode a p l i c a r o metodo n e s t e i n t e r v a l o ” << e n d l ;
c o u t << ” Causas p r o v a v e i s : ” << e n d l ;
c o u t << ” −ha mais que um z e r o n e s t e i n t e r v a l o ” << e n d l ;
c o u t << ” −nao ha z e r o s n e s t e i n t e r v a l o ” << e n d l ;
system ( ”PAUSE” ) ; // i n s t r u ç ã o para p a u s ar o s i s t e m a
return 0 ; // i n s t r u ç a o de s a i d a do programa
}
115
double x b i s 1 , x b i s=b m ; // i n i c i a l i z a ç a o de v a r i a v e i s do t i p o ’ d o u b l e ’
117
119
121
//CICLO1 : a p l i c a
// v a i de b i s =0 a
f o r ( int b i s =0;
{
xbis1 = (a
o metodo da b i s s e c ç a o ao i n t e r v a l o [ a m , b m ]
b i s <1000 incrementando a v a r i a v e l b i s
b i s < 1 0 0 0 ; b i s ++)
m+b m ) / 2 ; // f o r m u l a i t e r a t i v a do metodo
123
125
i f ( f ( a m ) ∗ f ( x b i s 1 ) <0) b m=x b i s 1 ;
e l s e i f ( f ( b m ) ∗ f ( x b i s 1 ) <0) a m=x b i s 1 ;
11
i f ( abs ( b m−a m ) <0.01) { x [ 0 ] = b m ; break ; }
// c a s o | b m−a m | <0.01 e n t a o guarda em x [ 0 ] o v a l o r de b m e s a i
/∗NOTA: a i n s t r u ç a o ’ b r e a k ’ p r o v o c a a s a i d a do c i c l o ∗/
127
129
}
131
133
135
137
139
141
143
// imprime o novo i n t e r v a l o I ’ e d i z o v a l o r e s c o l h i d o para x 0
c o u t << e n d l << ” Foi e n c o n t r a d o o i n t e r v a l o [ ” << a m << ” , ” << b m << ” ] . ” ;
c o u t << e n d l << ” Escolheu −s e x 0= ” << x [ 0 ] ;
c o u t << e n d l << e n d l ;
// c a l c u l a os e r r o s i n i c i a i s
e m [0]= z − x [ 0 ] ;
ex m [ 0 ] = z − x [ 0 ] ;
// imprime o c a b e ç a l h o da t a b e l a e a p r i m e i r a l i n h a d e s t a
c o u t << ” I t . x m \ te m1 \ t \ te m2 \ t
| e m /{ e {m−1}}ˆ2| \ t g ’ ” << e n d l ;
c o u t << ” 0
” << x [ 0 ] << ” \ t ” << e m [ 0 ] << ” \ t ” << ex m [ 0 ]
<< ”\ t−−−
\t
−−−” << e n d l ;
145
147
149
151
153
155
/∗CICLO2 : a p l i c a o metodo de s t e f f e n s e n ,
v a i de i =1 a t e i <1000 incrementando i ∗/
f o r ( int i =1; i <1000; i ++)
{
// c a l c u l a r x {m+1} p e l o metodo de s t e f f e n s e n
x [ i ] = x [ i −1] − f ( x [ i −1]) ∗ f ( x [ i −1]) / ( f ( x [ i −1]+ f ( x [ i −1]) )−f ( x [ i −1]) ) ;
s s = ( x [ i ]−x [ i −1]) / ( x [ i −1]−x [ i −2]) ; // c a l c u l a r a d e r i v a d a g ’
g d [ i ] = abs ( s s ) ;
// c a l c u l a r | g ’ |
ex m [ i ] = z − x [ i − 1 ] ;
// c a l c u l a r e r r o
e m [ i ] = x [ i ] − x [ i −1];
// c a l c u l a r e r r o e s t i m a d o
157
// c a l c u l a r a s u c e s s a o que t e n d e para o c o e f i c i e n t e a s s i n t o t i c o
k = abs ( e m [ i ] / ( e m [ i −1]∗ e m [ i −1]) ) ;
159
// s e g ( x m ) nao p e r t e n c e ao i n t e r v a l o , c=1
i f ( x [ i ]<a m && x [ i ]>b m ) c =1;
161
163
// i m p r e s s a o da t a b e l a
c o u t << i << ”
” << x [ i ] << ” \ t ” << e m [ i ] << ” \ t ”
<< ex m [ i ] << ” \ t ” << k << ”
\t” ;
i f ( i >= 2 ) c o u t << s s <<e n d l ;
e l s e c o u t << ”−−−” << e n d l ;
165
167
169
// c o n d i ç a o de paragem , s e o e r r o e s t i m a d o f o r menor que 1E−6
i f ( i >1 && abs ( e m [ i ] )< 1E−6)
{
m=i ;
// guarda a i t e r a ç a o em m
x m = x[ i ];
// guarda o v a l o r de x m
break ;
// s a i do c i c l o
}
171
173
175
}
177
179
181
// c a s o nao c o n v i r j a a p r e s e n t a e s s a informaçao
i f ( abs ( x [999] − x [ 9 9 8 ] ) > 1E−6) c o u t << ”O metodo nao c o n v e r g i u ” << e n d l ;
// c r i a um novo v e c t o r de m+1 e l e m e n t o s
double ∗ cgd= new double [m+ 1 ] ;
183
185
f o r ( int j =0; j <m+1; j ++)
cgd [ j ]= g d [ j ] ;
187
q u i c k s o r t ( cgd , 0 , m) ;
189
// c i c l o que p r e e n c h e o novo v e c t o r
// u t i l i z a q u i c k s o r t para o r d e n a r o novo v e c t o r
// imprimir o v a l o r do c o e f i c i e n t e a s s i n t o t i c o , c a l c u l a d o com r e c u r s o
12
// a segunda d e r i v a d a e o v a l o r do z e r o e n c o n t r a d o
c o u t << e n d l << ”K {\\ i n f t y } = ” << abs ( f d 2 ( x m ) / 2 ) << e n d l ;
c o u t << e n d l << ” Foi e n c o n t r a d o o z e r o ” << x m << ” . ” << e n d l << e n d l ;
191
193
i f ( c ) // s e c é d i f e r e n t e de ze r o , imprime
{
c o u t << e n d l << ”ATENCAO! A c o n d i ç a o de que g ( I ) nao p e r t e n c e a I nao s e
verifica”
<< e n d l ;
c o u t << ”O método pode não c o n v e r g i r ! ” << e n d l ;
}
195
197
199
201
i f ( cgd [m] >1) // s e o u l t i m o e l e m e n t o de cgd é maior que 1 , g nao e c o n t r a c t i v a
c o u t << ”ATENCAO! A f u n c a o g nao e c o n t r a c t i v a , o metodo pode nao c o n v e r g i r ”
<< e n d l ;
203
205
207
system ( ”PAUSE” ) ; // pausa o s i s t e m a
return 0 ;
// s a i do programa
}
3.5.2
steffensen sqrt2.cpp
1 /∗PROG QUE APLICA O METODO DE STEFFENSEN∗/
/∗IST , MEFT, MC 2010 ∗/
3 /∗JOAO CUNHA 67921 , NATALIA MORAIS 67936 , MIGUEL PRATA 67933 ∗/
5 #include <i o s t r e a m >
#include <cmath>
7 #include <c s t d l i b >
// h e a d e r que p o s s u i f u n ç o e s de i n p u t / o u t p u t
// h e a d e r que p o s s u i f u n ç o e s s t a n d a r t
// h e a d e r com f u n ç o e s matematicas
9 using namespace s t d ; // namespace com informaçao de f u n ç o e s
11 /∗ f u n ç a o f que r e t o r n a o v a l o r da f u n ç a o para um d et er mi n ad o ponto x dado
como argumento ∗/
13 double f ( double x )
{ return ( x∗x −2) ; }
15
/∗ f u n ç a o f d que r e t o r n a o v a l o r da p r i m e i r a d e r i v a d a de f para um
17 determi n ad o ponto x dado como argumento ∗/
double f d ( double x )
19
{ return 2∗ x ; }
21 /∗ f u n ç a o f d 2 que r e t o r n a o v a l o r da p r i m e i r a d e r i v a d a de f para um
determi n ad o ponto x dado como argumento ∗/
23 double f d 2 ( double x )
{ return 2 ; }
25
/∗ f u n ç a o t r o c a v a l o r e s que t r o c a d o i s e l e m e n t o s de um v e c t o r , r e c e b e n d o
27 como argumentos p o n t e i r o s para os e l e m e n t o s do v e c t o r ∗/
void t r o c a v a l o r e s ( double ∗n1 , double ∗n2 )
29 {
double i 1 ;
31
i 1 = ( ∗ n1 ) ;
33
( ∗ n1 ) = ( ∗ n2 ) ;
( ∗ n2 ) = i 1 ;
35 }
37 /∗ f u n ç a o q u i c k s o r t que ordena por ordem c r e c e n t e os e l e m e n t o s de um
v e c t o r r1 dado como argumento e os e l e m e n t o s i n i c i a l e f i n a l do v e c t o r ∗/
39 void q u i c k s o r t ( double ∗ r 1
, int e s q , int d i r )
{
41
int i , j , m ;
double rm ;
43
13
45
47
49
51
53
55
57
59
i = esq ;
j = dir ;
m = ( esq + d i r ) / 2 ;
rm = r 1 [m] ;
while ( i <= j )
{
while ( r 1 [ i ] < rm) ++i ;
while (rm < r 1 [ j ] ) −−j ;
i f ( i <= j )
{
t r o c a v a l o r e s (& r 1 [ i ] , &r 1 [ j ] ) ;
++i ;
−−j ;
}
}
i f ( e s q < j ) q u i c k s o r t ( r1 , esq , j ) ;
i f ( i < d i r ) q u i c k s o r t ( r1 , i , d i r ) ;
61 }
//−−−−−−−−−−−−−−−−−−−−−−−−−−−FUNÇAO PRINCIPAL MAIN−−−−−−−−−−−−−−−−−−−−−−−−−−−
63 int main ( )
{
65
// i n i c i a l i z a ç a o de v a r i a v e i s u t i l i z a d a s no programa
/∗NOTA: ’ d o u b l e ’ i n d i c a que a v a r i a v e i s s u p o r t a p r e c i s a o d u p l a
67
(6 a l g a r i s m o s s i g n i f i c a t i v o s / 6 c a s a d e c i m a i s ;
’ i n t ’ i n d i c a que a v a r i a v e l é um i n t e i r o ∗/
69
double c =0, f d c =0, x m , z , k , s s , a m , b m ;
int m;
71
// v a l o r dos z e r o s da f u n ç ã o f c o n h e c i d o s g e o m e t r i c a m e n t e
73
double z1= −1.41421;
double z2= 1 . 4 1 4 2 1 ;
75
// i n i c i a l i z a ç a o de v e c t o r e s de 1000 e l e m e n t o s cada
77
double g d [ 1 0 0 0 ] , x [ 1 0 0 0 ] , e m [ 1 0 0 0 ] , ex m [ 1 0 0 0 ] ;
79
81
83
85
87
89
/∗NOTA: O comando ’ c o u t ’ imprime no ecran ; o comando ’ e n d l ’ l im p a
o b u f f e r e c o l o c a p a s s a a proxima l i n h a ∗/
c o u t << ”\tMETODO DE STEFFENSEN” << e n d l << e n d l ;
// l e r os v a l o r e s a m e b m do t e c l a d o
c o u t << ” I n s i r a o extremo ’ a ’ do i n t e r v a l o I =[a , b ] : ” ;
c i n >> a m ;
/∗NOTA: ’ c i n ’ p e r m i t e r e c e b e r a informaçao do t e c l a d o e g u a r d a r numa
v a r i a v e l j a i n i c i a l i z a d a ∗/
c o u t << ” I n s i r a o extremo ’ b ’ do i n t e r v a l o I =[a , b ] : ” ;
c i n >> b m ;
91
93
95
/∗NOTA: ’ i f ’ é um comando c o n d i c i o n a l que e f e c t u a a i n s t r u ç a o s e a c o n d i ç a o
s e f o r v e r d a d e i r a ∗/
// v e r i f i c a q u a n t o s z e r o s tem no i n t e r v a l o
i f ( z1<b m && z1>a m ) { z = z1 ;
f d c ++;}
i f ( z2<b m && z2>a m ) { z = z2 ; f d c ++;}
97
99
101
103
105
107
// s e e x i s t i r e m mais que um z er o , ou f ( a m ) ∗ f ( b m )>0 imprime e s a i
// s e nao c o n t i n u a a c o r r e r o programa
i f ( f ( a m ) ∗ f ( b m )>0 | | f d c >1)
{
c o u t << e n d l ;
c o u t << ”ATENCAO! Nao s e pode a p l i c a r o metodo n e s t e i n t e r v a l o ” << e n d l ;
c o u t << ” Causas p r o v a v e i s : ” << e n d l ;
c o u t << ” −ha mais que um z e r o n e s t e i n t e r v a l o ” << e n d l ;
c o u t << ” −nao ha z e r o s n e s t e i n t e r v a l o ” << e n d l ;
system ( ”PAUSE” ) ; // i n s t r u ç ã o para p a u s ar o s i s t e m a
14
109
return 0 ; // i n s t r u ç a o de s a i d a do programa
}
111
double x b i s 1 , x b i s=b m ; // i n i c i a l i z a ç a o de v a r i a v e i s do t i p o ’ d o u b l e ’
113
//CICLO1 : a p l i c a
// v a i de b i s =0 a
f o r ( int b i s =0;
{
xbis1 = (a
115
117
o metodo da b i s s e c ç a o ao i n t e r v a l o [ a m , b m ]
b i s <1000 incrementando a v a r i a v e l b i s
b i s < 1 0 0 0 ; b i s ++)
m+b m ) / 2 ; // f o r m u l a i t e r a t i v a do metodo
i f ( f ( a m ) ∗ f ( x b i s 1 ) <0) b m=x b i s 1 ;
e l s e i f ( f ( b m ) ∗ f ( x b i s 1 ) <0) a m=x b i s 1 ;
119
121
i f ( abs ( b m−a m ) <0.01) { x [ 0 ] = b m ; break ; }
// c a s o | b m−a m | <0.01 e n t a o guarda em x [ 0 ] o v a l o r de b m e s a i
/∗NOTA: a i n s t r u ç a o ’ b r e a k ’ p r o v o c a a s a i d a do c i c l o ∗/
123
125
127
129
}
// imprime o novo i n t e r v a l o I ’ e d i z o v a l o r e s c o l h i d o para x 0
c o u t << e n d l << ” Foi e n c o n t r a d o o i n t e r v a l o [ ” << a m << ” , ” << b m << ” ] . ” ;
c o u t << e n d l << ” Escolheu −s e x 0= ” << x [ 0 ] ;
c o u t << e n d l << e n d l ;
131
133
// c a l c u l a os e r r o s i n i c i a i s
e m [0]= z − x [ 0 ] ;
ex m [ 0 ] = z − x [ 0 ] ;
135
137
139
141
143
145
147
149
// imprime o c a b e ç a l h o da t a b e l a e a p r i m e i r a l i n h a d e s t a
c o u t << ” I t . x m \ te m1 \ t \ te m2 \ t
| e m /{ e {m−1}}ˆ2| \ t g ’ ” << e n d l ;
c o u t << ” 0
” << x [ 0 ] << ” \ t ” << e m [ 0 ] << ” \ t ” << ex m [ 0 ]
<< ”\ t−−−
\t
−−−” << e n d l ;
/∗CICLO2 : a p l i c a o metodo de s t e f f e n s e n ,
v a i de i =1 a t e i <1000 incrementando i ∗/
f o r ( int i =1; i <1000; i ++)
{
// c a l c u l a r x {m+1} p e l o metodo de s t e f f e n s e n
x [ i ] = x [ i −1] − f ( x [ i −1]) ∗ f ( x [ i −1]) / ( f ( x [ i −1]+ f ( x [ i −1]) )−f ( x [ i −1]) ) ;
s s = ( x [ i ]−x [ i −1]) / ( x [ i −1]−x [ i −2]) ; // c a l c u l a r a d e r i v a d a g ’
g d [ i ] = abs ( s s ) ;
// c a l c u l a r | g ’ |
ex m [ i ] = z − x [ i − 1 ] ;
// c a l c u l a r e r r o
e m [ i ] = x [ i ] − x [ i −1];
// c a l c u l a r e r r o e s t i m a d o
151
// c a l c u l a r a s u c e s s a o que t e n d e para o c o e f i c i e n t e a s s i n t o t i c o
k = abs ( e m [ i ] / ( e m [ i −1]∗ e m [ i −1]) ) ;
153
155
// s e g ( x m ) nao p e r t e n c e ao i n t e r v a l o , c=1
i f ( x [ i ]<a m && x [ i ]>b m ) c =1;
157
// i m p r e s s a o da t a b e l a
c o u t << i << ”
” << x [ i ] << ” \ t ” << e m [ i ] << ” \ t ”
<< ex m [ i ] << ” \ t ” << k << ”
\t” ;
i f ( i >= 2 ) c o u t << s s <<e n d l ;
e l s e c o u t << ”−−−” << e n d l ;
159
161
163
// c o n d i ç a o de paragem , s e o e r r o e s t i m a d o f o r menor que 1E−6
i f ( i >1 && abs ( e m [ i ] )< 1E−6)
{
m=i ;
// guarda a i t e r a ç a o em m
x m = x[ i ];
// guarda o v a l o r de x m
break ;
// s a i do c i c l o
}
165
167
169
171
}
15
173
// c a s o nao c o n v i r j a a p r e s e n t a e s s a informaçao
i f ( abs ( x [999] − x [ 9 9 8 ] ) > 1E−6) c o u t << ”O metodo nao c o n v e r g i u ” << e n d l ;
175
// c r i a um novo v e c t o r de m+1 e l e m e n t o s
double ∗ cgd= new double [m+ 1 ] ;
177
179
f o r ( int j =0; j <m+1; j ++)
cgd [ j ]= g d [ j ] ;
// c i c l o que p r e e n c h e o novo v e c t o r
181
q u i c k s o r t ( cgd , 0 , m) ;
// u t i l i z a q u i c k s o r t para o r d e n a r o novo v e c t o r
183
// imprimir o v a l o r do c o e f i c i e n t e
// a segunda d e r i v a d a e o v a l o r do
c o u t << e n d l << ”K {\\ i n f t y } = ”
c o u t << e n d l << ” Foi e n c o n t r a d o o
185
187
189
a s s i n t o t i c o , c a l c u l a d o com r e c u r s o
zero encontrado
<< abs ( f d 2 ( x m ) / 2 ) << e n d l ;
z e r o ” << x m << ” . ” << e n d l << e n d l ;
i f ( c ) // s e c é d i f e r e n t e de ze r o , imprime
{
c o u t << e n d l << ”ATENCAO! A c o n d i ç a o de que g ( I ) nao p e r t e n c e a I nao s e
verifica”
<< e n d l ;
c o u t << ”O método pode não c o n v e r g i r ! ” << e n d l ;
}
191
193
195
i f ( cgd [m] >1) // s e o u l t i m o e l e m e n t o de cgd é maior que 1 , g nao e c o n t r a c t i v a
c o u t << ”ATENCAO! A f u n c a o g nao e c o n t r a c t i v a , o metodo pode nao c o n v e r g i r ”
<< e n d l ;
197
199
system ( ”PAUSE” ) ; // pausa o s i s t e m a
return 0 ;
// s a i do programa
201
}
3.5.3
steffensen aplicacao
/∗PROG QUE APLICA O METODO DE STEFFENSEN∗/
2 /∗IST , MEFT, MC 2010 ∗/
/∗JOAO CUNHA 67921 , NATALIA MORAIS 67936 , MIGUEL PRATA 67933 ∗/
4
#include <i o s t r e a m > // h e a d e r que p o s s u i f u n ç o e s de i n p u t / o u t p u t
6 #include <f s t r e a m >
// h e a d e r com f u n c o e s para e s c r i t a e l e i t u r a de f i c h e i r o s
#include <cmath>
// h e a d e r com f u n ç o e s matematicas
8
using namespace s t d ; // namespace com informaçao de f u n ç o e s
10
double h = 0 . 0 0 1 ; // v a r i a v e l g l o b a l , s u b s t i t u i t o d a s as o c o r r e n c i a s de h por 0 . 0 0 1
12
/∗ f u n c a o que r e t o r n a um v e c t o r com o v a l o r da p o s i c a o em R3 da p a r t i c u l a para
14 um i n s t a n t e t ∗/
double ∗ pos ( double t )
16
{
double ∗ r=new double [ 3 ] ; /∗ c r i a o e s p a ç o na memoria c o r r e s p o n d e n t e a um v e c t o r
18
t r i d i m e n s i o n a l ∗/
r [0]=(2+ c o s ( t / 2 ) ) ∗ c o s ( t ) ; // f u n c a o das p o s i c o e s no e i x o dos xx
20
r [1]=(2+ c o s ( t / 2 ) ) ∗ s i n ( t ) ; // f u n c a o das p o s i c o e s no e i x o dos yy
r [2]= s i n ( t /2) ;
// f u n c a o das p o s i c o e s no e i c o dos z z
22
return r ; // r e t o r n a o p o n t e i r o para o v e c t o r p o s i c a o
24
}
26 /∗ f u n c a o que r e t o r n a um v e c t o r com o v a l o r da v e l o c i d a d e em R3 da p a r t i c u l a para
um i n s t a n t e t ∗/
28 double ∗ v e l ( double t )
{
30
double ∗v=new double [ 3 ] ; /∗ c r i a o e s p a ç o na memoria c o r r e s p o n d e n t e a um v e c t o r
16
t r i d i m e n s i o n a l ∗/
v [0]=0 −1∗ s i n ( t / 2 ) ∗ c o s ( t ) /2− s i n ( t ) ∗ ( c o s ( t / 2 ) +2) ; // f u n c a o das v e l o c i d a d e s em x
v [ 1 ] = ( c o s ( t / 2 ) +2)∗ c o s ( t )−s i n ( t / 2 ) ∗ s i n ( t ) / 2 ;
// f u n c a o das v e l o c i d a d e s em y
v [2]= cos ( t /2) /2;
// f u n c a o das v e l o c i d a d e s em z
32
34
36
return v ; // r e t o r n a o p o n t e i r o para o v e c t o r v e l o c i d a d e
}
38
/∗ f u n c a o que r e t o r n a um v e c t o r com o v a l o r da d e r i v a d a da v e l o c i d a d e em R3 da
40 p a r t i c u l a para um i n s t a n t e t ∗/
double ∗ d v e l ( double t )
42
{
double ∗dv=new double [ 3 ] ; /∗ c r i a o e s p a ç o na memoria c o r r e s p o n d e n t e a um v e c t o r
44
t r i d i m e n s i o n a l ∗/
dv [ 0 ] = s i n ( t / 2 ) ∗ s i n ( t )−c o s ( t / 2 ) ∗ c o s ( t ) /4−( c o s ( t / 2 ) +2)∗ c o s ( t ) ;
// f u n c a o em x
46
dv[1]=0 − s i n ( t / 2 ) ∗ c o s ( t )−s i n ( t ) ∗ c o s ( t / 2 ) /4−( c o s ( t / 2 ) +2)∗ s i n ( t ) ; // f u n c a o em y
dv[2]= − s i n ( t / 2 ) / 4 ;
// f u n c a o em z
48
return dv ; // r e t o r n a o p o n t e i r o para o v e c t o r d e r i v a d a da v e l o c i d a d e
50
}
52 /∗ f u n c a o que r e t o r n a um v e c t o r com o v a l o r da segunda d e r i v a d a da v e l o c i d a d e em
R3 da p a r t i c u l a para um i n s t a n t e t ∗/
54 double ∗ d d v e l ( double t )
{
56
double ∗ddv=new double [ 3 ] ; /∗ c r i a o e s p a ç o na memoria c o r r e s p o n d e n t e a um v e c t o r
t r i d i m e n s i o n a l ∗/
58
ddv [ 0 ] = 1 3 ∗ s i n ( t / 2 ) ∗ c o s ( t ) /8+3∗ s i n ( t ) ∗ c o s ( t / 2 ) /4+( c o s ( t / 2 ) +2)∗ s i n ( t ) ; // f u n c a o em x
ddv [ 1 ] = 1 3 ∗ s i n ( t / 2 ) ∗ s i n ( t ) /8−3∗ c o s ( t / 2 ) ∗ c o s ( t ) /4−( c o s ( t / 2 ) +2)∗ c o s ( t ) ; // f u n c a o em y
60
ddv[2]= − c o s ( t / 2 ) / 8 ;
// f u n c a o em z
62
return ddv ; // r e t o r n a o p o n t e i r o para o v e c t o r segunda d e r i v a d a da v e l o c i d a d e
}
64
/∗ f u n ç a o t r o c a v a l o r e s que t r o c a d o i s e l e m e n t o s de um v e c t o r , r e c e b e n d o
66 como argumentos p o n t e i r o s para os e l e m e n t o s do v e c t o r ∗/
void t r o c a v a l o r e s ( double ∗n1 , double ∗n2 )
68
{
double i 1 ;
70
i 1 = ( ∗ n1 ) ;
72
( ∗ n1 ) = ( ∗ n2 ) ;
( ∗ n2 ) = i 1 ;
74
}
76 /∗ f u n ç a o q u i c k s o r t que ordena por ordem c r e c e n t e os e l e m e n t o s de um
v e c t o r r1 dado como argumento e os e l e m e n t o s i n i c i a l e f i n a l do v e c t o r ∗/
78 void q u i c k s o r t ( double ∗ r 1
, int e s q , int d i r )
{
80
int i , j , m ;
double rm ;
82
i = esq ;
84
j = dir ;
m = ( esq + d i r ) / 2 ;
86
rm = r 1 [m] ;
while ( i <= j )
88
{
while ( r 1 [ i ] < rm) ++i ;
90
while (rm < r 1 [ j ] ) −−j ;
i f ( i <= j )
92
{
t r o c a v a l o r e s (& r 1 [ i ] , &r 1 [ j ] ) ;
94
++i ;
17
−−j ;
}
96
}
i f ( e s q < j ) q u i c k s o r t ( r1 , esq , j ) ;
i f ( i < d i r ) q u i c k s o r t ( r1 , i , d i r ) ;
98
100
}
102 /∗ f u n c a o que e s c r e v e os v a l o r e s , para cada i n s t a n t e t , da p o s i ç a o da p a r t i c u l a
em R3 num f i c h e i r o , a v e l o c i d a d e segundo x para cada i n s t a n t e t e o i n s t a n t e t
104 n o u t r o f i c h e i r o , e i g u a l m e n t e para as v e l o c i d a d e s segundo y e z ∗/
void g r a f ( double ∗ r , double ∗v )
106
{
o f s t r e a m p ( ” t r a j e c t o r i a . t x t ” ) ; // a b r e o f i c h e i r o t r a j e c t o r i a . t x t
108
o f s t r e a m vx ( ” vxx . t x t ” ) ;
// a b r e o f i c h e i r o v x x . t x t
o f s t r e a m vy ( ” vyy . t x t ” ) ;
// a b r e o f i c h e i r o vyy . t x t
110
o f s t r e a m vz ( ” vzz . t x t ” ) ;
// a b r e o f i c h e i r o v z z . t x t
double t =0, t f =4∗M PI ; // v a r i a v e i s que guardam o i n s t a n t e f i n a l e i n i c i a l
112
while ( t<t f ) // c i c l o que s e r e a l i z a enquanto o i n t a n t e a c t u a l f o r menor que o
114
{
// i n s t a n t e f i n a l
r=pos ( t ) ; // guarda no v e c t o r r a p o s i c a o no i n s t a n t e t
116
v=v e l ( t ) ; // guarda no v e c t o r r a v e l o c i d a d e no i n s t a n t e t
p<<r [0]<< ’ ’<<r [1]<< ’ ’<<r [2]<< e n d l ; /∗ e s c r e v e as p o s i c o e s x , y e z no
118
f i c h e i r o t r a j e c t o r i a . t x t ∗/
vx<<t<< ’ ’<<v[0]<< e n d l ; /∗ e s c r e v e o i n s t a n t e t e a v e l o c i d a d e segundo o
120
e i x o dos xx no f i c h e i r o v x x . t x t ∗/
vy<<t<< ’ ’<<v[1]<< e n d l ; /∗ e s c r e v e o i n s t a n t e t e a v e l o c i d a d e segundo o
122
e i x o dos yy no f i c h e i r o vyy . t x t ∗/
vz<<t<< ’ ’<<v[2]<< e n d l ; /∗ e s c r e v e o i n s t a n t e t e a v e l o c i d a d e segundo o
124
e i x o dos z z no f i c h e i r o v z z . t x t ∗/
t+=h ; // i n c r e m e n t a o i n s t a n t e de 0 . 0 0 1
126
}
// f e c h a os f i c h e i r o s
128
p . close () ;
vx . c l o s e ( ) ;
130
vy . c l o s e ( ) ;
vz . c l o s e ( ) ;
132
/∗ as l i n h a s a b a i x o contem o e n d e r e c o do e x e c u t a v e l do g n u p l o t , que s e r v i r a
134
para d e s e n h a r os g r a f i c o s p r e t e n d i d o s . Se s e p r e t e n d e r d e s e n h a r os g r a f i c o s
t e r a de s e g a r a n t i r que os f i c h e i r o s p l o t . t x t e p l o t 2 . t x t e s t a o na mesma
136
p a s t a que o programa e que o e n d e r e c o para o e x e c u t a v e l do g n u p l o t s e
e n c o n t r a c o r r e c t o ∗/
138
system ( ” \” c : \ \ g n u p l o t \\ b i n a r y \\ g n u p l o t . exe \” p l o t . t x t ” ) ;
system ( ” \” c : \ \ g n u p l o t \\ b i n a r y \\ g n u p l o t . exe \” p l o t 2 . t x t ” ) ;
140
}
142 // f u n c a o que a p l i c a o metodo de s t e f f e n s e n
void s t e f f e n s e n ( char e )
144
{
// i n i c i a l i z a ç a o de v a r i a v e i s u t i l i z a d a s na f u n c a o
146
double a m , b m , ∗ z1 , z , f d c =0, c =0, k , s s , x m ;
double x [ 1 0 0 0 ] , e m [ 1 0 0 0 ] , g d [ 1 0 0 0 ] , ex m [ 1 0 0 0 ] ;
148
int n , nz , m;
150
cout<<endl <<” P o s i c o e s ”<<e<<” maximas ou minimas ”<<endl <<e n d l ;
152
i f ( e==’ x ’ ) // s e a e s c o l h a do u t i l i z a d o r f o r x ( v e r a b a i x o f u n c a o main )
{
z1=new double [ 3 ] ; // a l o c a o e s p a c o n e c e s s a r i o para um v e c t o r t r i d i m e n s i o n a l
// guarda no v e c t o r os v a l o r e s dos z e r o s
z1 [ 0 ] = 2 . 9 1 0 9 4 3 1 ; z1 [ 1 ] = 2 ∗ M PI ; ; z1 [ 2 ] = 9 . 6 5 5 4 2 7 5 ;
/∗ v a r i a v e i s com u t i l i z a d e mais a f r e n t e na f u n c a o . indicam que as
i n f o r m a c o e s r e f e r e n t e s ao e i x o dos xx e s t a o g u a r d a d a s na p o s i c a o 0 dos
154
156
158
18
v e c t o r e s p o s i c a o , v e l o c i d a d e , p r i m e i r a e segunda d e r i v a d a da v e l o c i d a d e
e que o numero de z e r o s da f u n c a o v e l o c i d a d e no i n t e r v a l o de 0 a 4 p i é 3 ∗/
n=0; nz =3;
160
184
}
e l s e i f ( e==’ y ’ ) // s e a e s c o l h a do u t i l i z a d o r f o r y ( v e r a b a i x o f u n c a o main )
{
z1=new double [ 4 ] ; // a l o c a o e s p a c o n e c e s s a r i o para um v e c t o r t r i d i m e n s i o n a l
// guarda no v e c t o r os v a l o r e s dos z e r o s
z1 [ 0 ] = 1 . 4 5 0 6 8 4 8 ; z1 [ 1 ] = 4 . 4 3 4 2 2 3 8 ; z1 [ 2 ] = 8 . 1 3 2 1 4 6 8 ; z1 [ 3 ] = 1 1 . 1 1 5 6 8 6 ;
/∗ v a r i a v e i s com u t i l i z a d e mais a f r e n t e na f u n c a o . indicam que as
i n f o r m a c o e s r e f e r e n t e s ao e i x o dos yy e s t a o g u a r d a d a s na p o s i c a o 0 dos
v e c t o r e s p o s i c a o , v e l o c i d a d e , p r i m e i r a e segunda d e r i v a d a da v e l o c i d a d e
e que o numero de z e r o s da f u n c a o v e l o c i d a d e no i n t e r v a l o de 1 a 4 p i é 4 ∗/
n=1; nz =4;
}
e l s e i f ( e==’ z ’ ) // s e a e s c o l h a do u t i l i z a d o r f o r z ( v e r a b a i x o f u n c a o main )
{
z1=new double [ 2 ] ; // a l o c a o e s p a c o n e c e s s a r i o para um v e c t o r t r i d i m e n s i o n a l
// guarda no v e c t o r os v a l o r e s dos z e r o s
z1 [ 0 ] = M PI ; z1 [ 1 ] = 3 ∗ M PI ;
/∗ v a r i a v e i s com u t i l i z a d e mais a f r e n t e na f u n c a o . indicam que as
i n f o r m a c o e s r e f e r e n t e s ao e i x o dos z z e s t a o g u a r d a d a s na p o s i c a o 0 dos
v e c t o r e s p o s i c a o , v e l o c i d a d e , p r i m e i r a e segunda d e r i v a d a da v e l o c i d a d e
e que o numero de z e r o s da f u n c a o v e l o c i d a d e no i n t e r v a l o de 2 a 4 p i é 2 ∗/
n=2; nz =2;
}
186
do
162
164
166
168
170
172
174
176
178
180
182
188
190
192
194
196
198
200
202
204
{ // c i c l o que p e r m i t e o b t e r os l i m i t e s a e b do i n t e r v a l o I =[a , b ]
do
{ // c i c l o que p e r m i t e o b t e r os l i m i t e s a e b do i n t e r v a l o I =[a , b ]
cout<<”A f u n c a o das p o s i c o e s de ”<<e<<” tem ”<<nz<<” extremos ”<<e n d l ;
cout<<” I n s i r a o l i m i t e ’ a ’ do i n t e r v a l o I =[a , b ] : ” ;
c i n >>a m ; // l e o v a l o r de a
cout<<” I n s i r a o l i m i t e ’ b ’ do i n t e r v a l o I =[a , b ] : ” ;
c i n >>b m ; // l e o v a l o r de b
/∗ Se os v a l o r e s de a e b nao s e encontrarem no i n t e r v a l o de 0 a 4 p i
imprime mensagem de e r r o ∗/
i f ( a m<=0 | | b m<=0 | | a m>=4∗M PI | | b m>=4∗M PI )
cout<<” Erro : a f u n c a o s o e s t a d e f i n i d a em ] 0 , 4 p i [ ”<<endl <<e n d l ;
}
// Enquanto os v a l o r e s de a e b nao s e encontrarem no i n t e r v a l o de 0 a 4 p i
while ( a m<=0 | | b m<=0 | | a m>=4∗M PI | | b m>=4∗M PI ) ;
f o r ( int i =0; i <nz ; ++i ) // v e r i f i c a q u a n t o s z e r o s tem no i n t e r v a l o
{ i f ( z1 [ i ]<b m && z1 [ i ]>a m ) { z = z1 [ i ] ;
f d c ++;}}
206
208
210
212
214
216
i f ( v e l ( a m ) [ n ] ∗ v e l ( b m ) [ n]>0 | | f d c >1)
{ /∗ s e e x i s t i r mais que um z er o , ou f ( a ) ∗ f ( b )>0 imprime mensagem de
e r r o ∗/
c o u t << e n d l ;
c o u t << ”ATENCAO! Nao s e pode a p l i c a r o metodo n e s t e i n t e r v a l o ” << e n d l ;
c o u t << ” Causas p r o v a v e i s : ” << e n d l ;
c o u t << ” −ha mais que um extremo n e s t e i n t e r v a l o ” << e n d l ;
c o u t << ” −nao ha extremos n e s t e i n t e r v a l o ” << endl <<e n d l ;
}
} // enquanto e x i s t i r mais que um z e ro , ou f ( a ) ∗ f ( b )>0
while ( v e l ( a m ) [ n ] ∗ v e l ( b m ) [ n]>0 | | f d c >1) ;
218
double x b i s 1 , x b i s=b m ; // i n i c i a l i z a ç a o de v a r i a v e i s
220
222
//CICLO1 : a p l i c a o metodo da b i s s e c ç a o ao i n t e r v a l o [ a m , b m ]
// v a i de b i s =0 a b i s <1000 incrementando a v a r i a v e l b i s
19
224
for ( int b i s =0; b i s < 1 0 0 0 ; b i s ++)
{
x b i s 1 = ( a m+b m ) / 2 ; // f o r m u l a i t e r a t i v a do metodo
226
228
230
232
234
236
i f ( v e l ( a m ) [ n ] ∗ v e l ( x b i s 1 ) [ n] <0) b m=x b i s 1 ;
e l s e i f ( v e l ( b m ) [ n ] ∗ v e l ( x b i s 1 ) [ n] <0) a m=x b i s 1 ;
i f ( abs ( b m−a m ) <0.01) { x [ 0 ] = b m ; break ; }
// c a s o | b−a | <0.01 e n t a o guarda em x [ 0 ] o v a l o r de b e s a i
}
// imprime o novo i n t e r v a l o I ’ e d i z o v a l o r e s c o l h i d o para x 0
cout<<endl <<” Foi e n c o n t r a d o o i n t e r v a l o [ ”<<a m<<” , ”<<b m<<” ] . ” ;
c o u t << e n d l << ” Escolheu −s e x 0= ” << x [ 0 ] ;
cout<<endl <<e n d l ;
238
240
// c a l c u l a os e r r o s i n i c i a i s (1 e 2)
e m [ 0 ] = z−x [ 0 ] ;
ex m [ 0 ] = z − x [ 0 ] ;
242
244
246
248
250
252
254
256
258
// imprime o c a b e ç a l h o da t a b e l a e a p r i m e i r a l i n h a
c o u t << ” I t . x m \ te m1 \ t \ te m2 \ t
| e m /{ e {m−1}}ˆ2| \ t g ’ ” << e n d l ;
c o u t << ” 0
” << x [ 0 ] << ” \ t ” << e m [ 0 ] << ” \ t ” << ex m [ 0 ]
<< ”\ t−−−
\t
−−−” << e n d l ;
/∗CICLO2 : a p l i c a o metodo de s t e f f e n s e n , v a i de i =1 a t e i <1000 incrementando i ∗/
for ( int i =1; i <1000; i ++)
{
// c a l c u l a r x {m+1} p e l o metodo de s t e f f e n s e n
x [ i ]=x [ i −1]− v e l ( x [ i −1]) [ n ] ∗ v e l ( x [ i −1]) [ n ] / ( v e l ( x [ i −1]+ v e l ( x [ i −1]) [ n ] ) [ n]− v e l ( x [ i −1])
[n]) ;
s s =(x [ i ]−x [ i −1]) / ( x [ i −1]−x [ i −2]) ; // c a l c u l a r a d e r i v a d a g ’
g d [ i ]= abs ( s s ) ;
// c a l c u l a r | g ’ |
e m [ i ]=x [ i ]−x [ i − 1 ] ;
// c a l c u l a r e r r o
ex m [ i ] = z − x [ i − 1 ] ;
// c a l c u l a r e r r o e s t i m a d o
// c a l c u l a r a s u c e s s a o que t e n d e para o c o e f i c i e n t e a s s i n t o t i c o
k=abs ( e m [ i ] / ( e m [ i −1]∗ e m [ i −1]) ) ;
260
262
264
266
// s e g ( x m ) nao p e r t e n c e ao i n t e r v a l o , c=1
i f ( x [ i ]<a m && x [ i ]>b m ) c =1;
// i m p r e s s a o da t a b e l a
cout<<i <<”
”<<x [ i ]<<” \ t ”<<e m [ i ]<<” \ t ”<<ex m [ i ]<<” \ t ”<<k<<”
i f ( i >= 2 ) c o u t << s s <<e n d l ;
e l s e c o u t << ”−−−” << e n d l ;
268
270
272
274
276
278
// c o n d i ç a o de paragem , s e o e r r o e s t i m a d o f o r menor que 1E−6
i f ( i >1 && abs ( x [ i ]−x [ i −1])< 1E−6)
{
m=i ;
// guarda a i t e r a ç a o em m
x m = x [ i ] ; // guarda o v a l o r de x m
break ;
// s a i do c i c l o
}
}
// c a s o nao c o n v i r j a a p r e s e n t a e s s a informaçao
i f ( abs ( x [999] − x [ 9 9 8 ] ) >1E−6) cout<<”O metodo nao c o n v e r g i u ”<<e n d l ;
280
282
284
// c r i a um novo v e c t o r de m+1 e l e m e n t o s
double ∗ cgd= new double [m+ 1 ] ;
for ( int j =0; j <m+1; j ++) // c i c l o que p r e e n c h e o novo v e c t o r
cgd [ j ]= g d [ j ] ;
20
\t” ;
286
q u i c k s o r t ( cgd , 0 , m) ; // u t i l i z a q u i c k s o r t para o r d e n a r o novo v e c t o r
288
/∗ imprimir o v a l o r do c o e f i c i e n t e a s s i n t o t i c o , c a l c u l a d o com r e c u r s o
a segunda d e r i v a d a e o v a l o r do z e r o e n c o n t r a d o ∗/
c o u t << e n d l << ”K {\\ i n f t y } = ” << abs ( d d v e l ( x m ) [ n ] / 2 ) << e n d l ;
c o u t << e n d l << ” Foi e n c o n t r a d o o extremo ” << x m << ” que c o r r e s p o n d e a um ” ;
290
292
294
// s e o v a l o r da p o s i c a o f o r maior que z e r o e n t a o é um maximo
i f ( pos ( x m ) [ n] >0) cout<<”maximo” ;
// s e o v a l o r da p o s i c a o f o r menor que z e r o e n t a o é um minimo
i f ( pos ( x m ) [ n] <0) cout<<”minimo” ;
296
298
cout<<” de p o s i c a o ”<<endl <<e n d l ;
300
c o u t << e n d l ;
302
if (c)
{ // s e c é d i f e r e n t e de ze r o , imprime
c o u t << e n d l << ”ATENCAO! A c o n d i ç a o de que g ( I ) nao p e r t e n c e a I nao s e v e r i f i c a ”
<< e n d l ;
c o u t << ”O método pode não c o n v e r g i r ! ” << e n d l ;
}
304
306
308
i f ( g d [m] >1) // s e o u l t i m o e l e m e n t o de cgd é maior que 1 , g nao e c o n t r a c t i v a
c o u t << ”ATENCAO! A f u n c a o g nao e c o n t r a c t i v a , o metodo pode nao c o n v e r g i r ” << e n d l ;
310
}
312
//−−−−−−−−−−−−−−−−−−−−−−−−−−−FUNÇAO PRINCIPAL MAIN−−−−−−−−−−−−−−−−−−−−−−−−−−−
314 int main ( )
{
316
// i n i c i a l i z a c a o das v a r i a v e i s
double ∗ r , ∗v ;
318
char e ;
320
322
// Imprime um t i t u l o com informacao do programa
cout<<” \ t T r a j e c t o r i a de uma p a r t i c u l a em R3”<<endl <<e n d l ;
cout<<” r =((2+ c o s ( t / 2 ) ) ∗ c o s ( t ) ,(2+ c o s ( t / 2 ) ) ∗ s i n ( t ) , s i n ( t / 2 ) ) ”<<e n d l ;
cout<<” t em ] 0 , 4 p i [ ”<<endl <<e n d l ;
324
326
//chama a f u n c a o para d e s e n h a r os g r a f i c o s
graf (r , v) ;
328
do
330
332
334
{ /∗ c i c l o que p e r m i t e ao u t i l i z a d o r e s c o l h e r s e p r e t e n d e
e x t r e m o s das p o s i c o e s no e i x o dos xx , yy ou z z ∗/
cout<<” P ret en de : ”<<e n d l ;
cout<<” Enc ontrar o s extremos das p o s i c o e s no e i x o dos
cout<<” Enc ontrar o s extremos das p o s i c o e s no e i x o dos
cout<<” Enc ontrar o s extremos das p o s i c o e s no e i x o dos
c i n >>e ; // guarda a e s c o l h a na v a r i a v e l e ( x , y ou z )
e n c o n t r a r os
( x ) ’ s ”<<e n d l ;
( y ) ’ s ”<<e n d l ;
( z ) ’ s ”<<e n d l ;
336
338
340
342
344
// s e a e s c o l h a nao f o r v a l i d a imprime mensagem de e r r o
i f ( e != ’ x ’ && e != ’ y ’ && e != ’ z ’ )
cout<<” Erro : E s c o l h a ( x ) , ( y ) ou ( z ) ”<<e n d l ;
}
// enquanto a e s c o l h a nao f o r v a l i d a
while ( e != ’ x ’ && e != ’ y ’ && e != ’ z ’ ) ;
s t e f f e n s e n ( e ) ; /∗chama a f u n c a o que a p l i c a o metodo de s t e f f e n s e n , e n v i a n d o
para e s t a a v a r i a v e i que contem a e s c o l h a do u t i l i z a d o r ∗/
346
348
system ( ”PAUSE” ) ; // pausa o s i s t e m a
return 0 ;
// s a i do programa
21
}
3.5.4
newtongeneralizado.c
1 /∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
∗
TRABALHO DE MATEMATICA COMPUTACIONAL
∗
3 ∗
∗
∗
METODO DE NEWTON GENERALIZADO
∗
5 ∗
∗
∗
JOAO CUNHA, MIGUEL PRATA, NATALIA MORAIS
∗
7 ∗
∗
∗
IST − MEFT − 2010/2011
∗
9 ∗
∗
∗
∗
11 /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗HEADERS∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗/
#include <s t d i o . h>
13 #include < s t d l i b . h>
#include <math . h>
15 #define max( a , b ) ( a > b ) ? a : b
/∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗FUNCOES EXTERNAS∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗/
17 f l o a t maxi ( f l o a t a , f l o a t b , f l o a t c )
{
19 f l o a t t 1 ;
i f ( a<b ) t 1=b ;
21 e l s e t 1=a ;
i f ( t1<c ) return c ;
23 e l s e return t 1 ;
}
25 // Funcao F − 1 a l i n h a do s i s t e m a
float funcf ( float x , float y , float z )
27 {
return ( x∗y − z ∗ z +3) ;
29 }
// Derivada p a r c i a l de F em ordem a x
31 f l o a t d x f ( f l o a t x , f l o a t y , f l o a t z )
{
33 return y ;
}
35 // Derivada p a r c i a l de F em ordem a y
float dyf ( float x , float y , float z )
37 {
return x ;
39 }
// Derivada p a r c i a l de F em ordem a z
41 f l o a t d z f ( f l o a t x , f l o a t y , f l o a t z )
{
43 return −2∗z ;
}
45 // Funcao G − 2 a l i n h a do s i s t e m a
float funcg ( float x , float y , float z )
47 {
return ( x∗y∗ z − x∗x + y∗y −2) ;
49 }
// Derivada p a r c i a l de G em ordem a x
51 f l o a t dxg ( f l o a t x , f l o a t y , f l o a t z )
{
53 return ( y∗ z − 2∗ x ) ;
}
55 // Derivada p a r c i a l de G em ordem a y
f l o a t dyg ( f l o a t x , f l o a t y , f l o a t z )
57 {
return ( x∗ z + 2∗ y ) ;
59 }
// Derivada p a r c i a l de G em ordem a z
61 f l o a t dzg ( f l o a t x , f l o a t y , f l o a t z )
22
{
63
65
67
69
71
73
75
77
79
81
83
85
87
89
return ( x∗y ) ;
}
// Funcao H − 3 a l i n h a do s i s t e m a
f l o a t funch ( f l o a t x , f l o a t y , f l o a t z )
{
return ( exp ( x ) − exp ( y ) + z − 3 ) ;
}
// Derivada p a r c i a l de H em ordem a x
f l o a t dxh ( f l o a t x , f l o a t y , f l o a t z )
{
return exp ( x ) ;
}
// Derivada p a r c i a l de H em ordem a y
f l o a t dyh ( f l o a t x , f l o a t y , f l o a t z )
{
return −exp ( y ) ;
}
// Derivada p a r c i a l de H em ordem a z
f l o a t dzh ( f l o a t x , f l o a t y , f l o a t z )
{
return 1 ;
}
// f u n c a o que f a z e l i m i n a c a o de g a u s s com p e s q u i s a p a r c i a l de p i v o t
void f o r w a r d e l i m ( int m a t r i x s i z e , f l o a t ∗∗A, int ∗L)
{
int i , j , k , tempi , tempk ;
f l o a t ∗S ;
f l o a t xmult , smax , rmax , r a t i o ;
91
S = c a l l o c ( ( m a t r i x s i z e +1) , s i z e o f ( f l o a t ) ) ;
93
95
97
99
101
103
105
107
109
111
113
115
117
119
121
for ( i = 1 ; i <= m a t r i x s i z e ; i ++)
{
L[ i ] = i ;
smax = 0 . 0 ;
fo r ( j = 1 ; j <= m a t r i x s i z e ; j ++)
smax = 1 ;
S [ i ] = smax ;
}
for ( k = 1 ; k < m a t r i x s i z e ; k++)
{
rmax = 0 . 0 ;
for ( i = k ; i <= m a t r i x s i z e ; i ++)
{
tempi = L [ i ] ;
r a t i o = f a b s (A[ tempi ] [ k ] / S [ tempi ] ) ;
i f ( r a t i o > rmax )
{
rmax = r a t i o ;
j = i;
}
}
tempk = L [ j ] ;
L[ j ] = L[ k ] ;
L [ k ] = tempk ;
123
for ( i = k+1; i <= m a t r i x s i z e ; i ++)
{
tempi = L [ i ] ;
125
xmult = A[ tempi ] [ k ] /A[ tempk ] [ k ] ;
23
A[ tempi ] [ k ] = xmult ;
fo r ( j = k+1; j<= m a t r i x s i z e ; j ++)
A[ tempi ] [ j ] −= xmult ∗ A[ tempk ] [ j ] ;
127
}
129
}
131 }
// f u n c a o que r e s o l v e o s i s t e m a de e q u a c o e s l i n e a r e s
133 void s o l v e ( int m a t r i x s i z e , f l o a t ∗∗A, int ∗L , f l o a t ∗B, f l o a t ∗X)
{
135
int i , j , k , tempi , tempk , tempn ;
137
f l o a t sum ;
139
for ( k = 1 ; k < m a t r i x s i z e ; k++)
{
tempk = L [ k ] ;
for ( i = k+1; i <= m a t r i x s i z e ; i ++)
{
tempi = L [ i ] ;
141
143
145
B [ tempi ] −= A[ tempi ] [ k ] ∗ B [ tempk ] ;
147
149
}
}
tempn = L [ m a t r i x s i z e ] ;
X[ m a t r i x s i z e ] = B [ tempn ] / A[ tempn ] [ m a t r i x s i z e ] ;
151
153
155
157
159
for ( i = m a t r i x s i z e −1; i>= 1 ; i −−)
{
tempi = L [ i ] ;
sum = B [ tempi ] ;
for ( j = i +1; j <= m a t r i x s i z e ; j ++)
sum −= A[ tempi ] [ j ] ∗ X[ j ] ;
X[ i ] = sum / A[ tempi ] [ i ] ;
}
}
161 // f u n c a o MAIN
void main ( )
163 {
// i n i c i a l i z a c a o de p o n t e i r o s
165 f l o a t ∗∗A, ∗B, ∗X;
int ∗L ;
167 // i n i c i a l i z a c a o de v a r i a v e i s
int i , j , m a t r i x s i z e , n ;
169 f l o a t x0 , y0 , z0 , x n , y n , z n , d e l t a x , d e l t a y , d e l t a z , e n ;
// d e f i n i c a o dos p o n t o s i n i c i a i s
171 x0=−21;
y0 =10;
173 z0 =2;
175 // d e f i n i c a o do tamanho das m a t r i z e s
matrix size = 3;
177 // a l o c a o de memoria para as m a t r i z e s
A = c a l l o c ( ( m a t r i x s i z e +1) , s i z e o f ( f l o a t ∗ ) ) ;
179 B = c a l l o c ( ( m a t r i x s i z e +1) , s i z e o f ( f l o a t ) ) ;
X = c a l l o c ( ( m a t r i x s i z e +1) , s i z e o f ( f l o a t ) ) ;
181 L = c a l l o c ( ( m a t r i x s i z e +1) , s i z e o f ( f l o a t ) ) ;
// c r i a c a o de m a t r i z e s
183
for ( i = 0 ; i <= m a t r i x s i z e ; i ++)
A[ i ] = c a l l o c ( ( m a t r i x s i z e +1) , s i z e o f ( f l o a t ) ) ;
185 // i m p r e s s a o de t a b e l a s c a b e c a l h o e i n t e r f a c e
p r i n t f ( ” \n\n\ t \ t \ t \ t \ t \ tMetodo de Newton G e n e r a l i z a d o \n\n” ) ;
187
p r i n t f ( ” | \ n | xy − z +3 = 0\n | xyz − x ˆ2 + y ˆ2 − 2 = 0\n | e ˆx − e ˆy + z − 3 = 0\n | \ n\n\n” )
;
24
189
191
193
195
197
199
201
203
205
207
209
211
213
215
217
219
221
223
225
227
p r i n t f ( ” I n s i r a o ponto i n i c i a l x0 ” ) ;
s c a n f ( ”%f ” ,&x0 ) ;
fflush ( stdin ) ;
p r i n t f ( ” \ n I n s i r a o ponto i n i c i a l y0 ” ) ;
s c a n f ( ”%f ” ,&y0 ) ;
fflush ( stdin ) ;
p r i n t f ( ” \ n I n s i r a o ponto i n i c i a l z0 ” ) ;
s c a n f ( ”%f ” ,& z0 ) ;
fflush ( stdin ) ;
p r i n t f ( ” \ t \ t \ t \ t \ t \ t \ t R e s u l t a d o s : \ n\n\n” ) ;
printf (” Iterada k
xˆk
yˆk
z ˆk
| | Xˆk − Xˆ ( k−1) | |
| | e ˆk | |
| | e ˆk | | / | | e ˆ ( k−1) | | \ n\n” ) ;
// metodo de newton
for ( n=0; n < 1 0 0 ; n++)
{
// guarda c o p i a s de x0 , y0 , z0 para comparacao com os p o n t o s s e g u i n t e s
x n=x0 ;
y n=y0 ;
z n=z0 ;
e n = maxi ( f a b s (1.29279 − x n ) , f a b s (0.998577 − y n ) , f a b s (2.07146 − z n ) ) ;
// p r e e n c h i m e n t o da m a t r i z J a c o b i a n a com as d e r i v a d a s p a r c i a i s
A [ 1 ] [ 1 ] = d x f ( x0 , y0 , z0 ) ; A [ 1 ] [ 2 ] = d y f ( x0 , y0 , z0 ) ; A [ 1 ] [ 3 ] = d z f ( x0 , y0 , z0 ) ;
A [ 2 ] [ 1 ] = dxg ( x0 , y0 , z0 ) ; A [ 2 ] [ 2 ] = dyg ( x0 , y0 , z0 ) ; A [ 2 ] [ 3 ] = dzg ( x0 , y0 , z0 ) ;
A [ 3 ] [ 1 ] = dxh ( x0 , y0 , z0 ) ; A [ 3 ] [ 2 ] = dyh ( x0 , y0 , z0 ) ; A [ 3 ] [ 3 ] = dzh ( x0 , y0 , z0 ) ;
// p r e e n c h i m e n t o do v e c t o r com as f u n c o e s
B [ 1 ] = −f u n c f ( x0 , y0 , z0 ) ;
B [ 2 ] = −f u n c g ( x0 , y0 , z0 ) ;
B [ 3 ] = −funch ( x0 , y0 , z0 ) ;
// a p l i c a as f u n c o e s de e l e m i n c a o de g a u s s e r e s o l u c a o do s i s t e m a l i n e a r
f o r w a r d e l i m ( m a t r i x s i z e , A, L) ;
s o l v e ( m a t r i x s i z e , A, L , B,X) ;
// guarda os r e s u l t a d o s
x0 = x0 + X [ 1 ] ;
y0 = y0 + X [ 2 ] ;
z0 = z0 + X [ 3 ] ;
// v e r i f i c a c a o da c o n v e r g e n c i a
i f ( f a b s (X [ 1 ] ) < 0 . 0 0 0 0 0 0 1
| | f a b s (X [ 2 ] ) < 0 . 0 0 0 0 0 0 1 | | f a b s (X [ 3 ] ) < 0 . 0 0 0 0 0 0 1 ) break
;
// i m p r e s s a o de r e s u l t a d o s
i f ( n==0) p r i n t f ( ” %d
%f
%f
%f
−
%f
−\n” , n , x0 , y0 , z0 , maxi ( f a b s (1.29279 − x0 ) , f a b s (0.998577 − y0 ) , f a b s
(2.07146 − z0 ) ) ) ;
i f ( n>0) p r i n t f ( ” %d
%f
%f
%f
%f
%f
%f \n” , n , x0 , y0 , z0 , maxi ( f a b s ( x0−x n ) , f a b s ( y0−y n ) , f a b s ( z0−z n ) ) , maxi (
f a b s (1.29279 − x0 ) , f a b s (0.998577 − y0 ) , f a b s (2.07146 − z0 ) ) , maxi ( f a b s (1.29279 − x0 ) , f a b s
(0.998577 − y0 ) , f a b s (2.07146 − z0 ) ) / e n ) ;
229
231 }
// l i b e r t a a memoria a l o c a d a
233
f r e e (A) ;
f r e e (X) ;
235
f r e e (B) ;
f r e e (L) ;
237 p r i n t f ( ” \ n V e r i f i c o u −s e c o n v e r g e n c i a apos %d i t e r a d a s \n\n” , n ) ;
i f ( n==99) ( ”Não s e v e r i f i c o u c o n v e r g e n c i a apos 100 i t e r a d a s , t e n t e o u t r a s c o n d i c o e s i n i c a i s
\n\n” ) ;
239
system ( ”PAUSE” ) ;
return 0 ;
241 }
3.5.5
newtongeneralizado2.c
1 /∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
25
∗
TRABALHO DE MATEMATICA COMPUTACIONAL
∗
3 ∗
∗
∗
METODO DE NEWTON GENERALIZADO
∗
5 ∗
∗
∗
JOAO CUNHA, MIGUEL PRATA, NATALIA MORAIS
∗
7 ∗
∗
∗
IST − MEFT − 2010/2011
∗
9 ∗
∗
∗
∗
11 /∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗HEADERS∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗/
#include <s t d i o . h>
13 #include < s t d l i b . h>
#include <math . h>
15 #define max( a , b ) ( a > b ) ? a : b
/∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗FUNCOES EXTERNAS∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗/
17 f l o a t maxi ( f l o a t a , f l o a t b )
{
19 f l o a t t 1 ;
i f ( a<b ) return b ;
21 e l s e return a ;
}
23 // Funcao F − 1 a l i n h a do s i s t e m a
float funcf ( float x , float y)
25 {
return ( 1 0 ∗ x∗x + s i n ( y ) −20) ;
27 }
// d e r i v a d a p a r c i a l de f em ordem a x
29 f l o a t d x f ( double x )
{
31 return 20∗ x ;
}
33 // d e r i v a d a p a r c i a l de f em ordem a y
float dyf ( float y )
35 {
return c o s ( y ) ;
37 }
// Funcao G − 2 a l i n h a do s i s t e m a
39 f l o a t f u n c g ( f l o a t x , f l o a t y )
{
41 return ( pow ( x , 4 ) + 5∗ y −6) ;
}
43 // d e r i v a d a p a r c i a l de g em ordem a x
f l o a t dxg ( f l o a t x )
45 {
return ( 4 ∗ pow ( x , 3 ) ) ;
47 }
// d e r i v a d a p a r c i a l de g em ordem a y
49 f l o a t dyg ( f l o a t y )
{
51 return 5 ;
}
53 // f u n c a o que f a z e l i m i n a c a o de g a u s s com p e s q u i s a p a r c i a l de p i v o t
void f o r w a r d e l i m ( int m a t r i x s i z e , f l o a t ∗∗A, int ∗L)
55 {
int i , j , k , tempi , tempk ;
57 f l o a t ∗S ;
f l o a t xmult , smax , rmax , r a t i o ;
59
S = c a l l o c ( ( m a t r i x s i z e +1) , s i z e o f ( f l o a t ) ) ;
61
for ( i = 1 ; i <= m a t r i x s i z e ; i ++)
63 {
L[ i ] = i ;
65
smax = 0 . 0 ;
26
fo r ( j = 1 ; j <= m a t r i x s i z e ; j ++)
smax = 1 ;
S [ i ] = smax ;
67
}
69
71
for ( k = 1 ; k < m a t r i x s i z e ; k++)
{
rmax = 0 . 0 ;
for ( i = k ; i <= m a t r i x s i z e ; i ++)
{
tempi = L [ i ] ;
r a t i o = f a b s (A[ tempi ] [ k ] / S [ tempi ] ) ;
i f ( r a t i o > rmax )
{
rmax = r a t i o ;
j = i;
}
}
73
75
77
79
81
83
85
tempk = L [ j ] ;
L[ j ] = L[ k ] ;
L [ k ] = tempk ;
87
89
for ( i = k+1; i <= m a t r i x s i z e ; i ++)
{
tempi = L [ i ] ;
91
93
xmult = A[ tempi ] [ k ] /A[ tempk ] [ k ] ;
A[ tempi ] [ k ] = xmult ;
fo r ( j = k+1; j<= m a t r i x s i z e ; j ++)
A[ tempi ] [ j ] −= xmult ∗ A[ tempk ] [ j ] ;
95
}
97
}
99
}
101 // f u n c a o que r e s o l v e o s i s t e m a de e q u a c o e s l i n e a r e s
void s o l v e ( int m a t r i x s i z e , f l o a t ∗∗A, int ∗L , f l o a t ∗B, f l o a t ∗X)
103 {
int i , j , k , tempi , tempk , tempn ;
105
f l o a t sum ;
107
for ( k = 1 ; k < m a t r i x s i z e ; k++)
109
{
tempk = L [ k ] ;
111
for ( i = k+1; i <= m a t r i x s i z e ; i ++)
{
113
tempi = L [ i ] ;
B [ tempi ] −= A[ tempi ] [ k ] ∗ B [ tempk ] ;
115
}
117
119
}
tempn = L [ m a t r i x s i z e ] ;
X[ m a t r i x s i z e ] = B [ tempn ] / A[ tempn ] [ m a t r i x s i z e ] ;
121
123
125
127
for ( i = m a t r i x s i z e −1; i>= 1 ; i −−)
{
tempi = L [ i ] ;
sum = B [ tempi ] ;
for ( j = i +1; j <= m a t r i x s i z e ; j ++)
sum −= A[ tempi ] [ j ] ∗ X[ j ] ;
X[ i ] = sum / A[ tempi ] [ i ] ;
}
129 }
27
// f u n c a o MAIN
131 void main ( )
{
133 // i n i c i a l i z a c a o de p o n t e i r o s
f l o a t ∗∗A, ∗B, ∗X;
135 int ∗L ;
// i n i c i a l i z a c a o de v a r i a v e i s
137 int i , j , m a t r i x s i z e , n ;
f l o a t x0 , y0 , x n , y n , d e l t a x , d e l t a y , e n ;
139 // d e f i n i c a o dos p o n t o s i n i c i a i s
x0 =1;
141 y0 =1;
// d e f i n i c a o do tamanho das m a t r i z e s
143 m a t r i x s i z e = 2 ;
// a l o c a o de memoria para as m a t r i z e s
145 A = c a l l o c ( ( m a t r i x s i z e +1) , s i z e o f ( f l o a t ∗ ) ) ;
B = c a l l o c ( ( m a t r i x s i z e +1) , s i z e o f ( f l o a t ) ) ;
147 X = c a l l o c ( ( m a t r i x s i z e +1) , s i z e o f ( f l o a t ) ) ;
L = c a l l o c ( ( m a t r i x s i z e +1) , s i z e o f ( f l o a t ) ) ;
149 // c r i a c a o de m a t r i z e s
for ( i = 0 ; i <= m a t r i x s i z e ; i ++)
151
A[ i ] = c a l l o c ( ( m a t r i x s i z e +1) , s i z e o f ( f l o a t ) ) ;
// i m p r e s s a o de t a b e l a s e c a b e c a l h o
153 p r i n t f ( ” \n\n\ t \ t \ t \ t \ t \ tMetodo de Newton G e n e r a l i z a d o \n\n” ) ;
p r i n t f ( ” | \ n | 1 0 x ˆ2 + s i n ( y ) − 20 = 0\n | x ˆ4 + 5y − 6 = 0\n | \ n\n\n\n” ) ;
155
p r i n t f ( ” I n s i r a o ponto i n i c i a l x0 ” ) ;
157
s c a n f ( ”%f ” ,&x0 ) ;
fflush ( stdin ) ;
159
p r i n t f ( ” \ n I n s i r a o ponto i n i c i a l y0 ” ) ;
161
s c a n f ( ”%f ” ,&y0 ) ;
fflush ( stdin ) ;
163
p r i n t f ( ” \ t \ t \ t \ t \ t \ t \ t R e s u l t a d o s : \ n\n\n” ) ;
165
printf (” Iterada k
xˆk
yˆk
| | Xˆk − Xˆ ( k−1) | |
| | eˆ
k||
| | e ˆk | | / | | e ˆ ( k−1) | | \ n\n” ) ;
// metodo de newton
167 for ( n=0; n < 1 0 0 ; n++)
{
169 // guarda c o p i a s de x0 e y0 para comparacao com os p o n t o s s e g u i n t e s
x n=x0 ;
171 y n=y0 ;
e n = maxi ( f a b s (1.39929 − x n ) , f a b s (0.433232 − y n ) ) ;
173 // p r e e n c h i m e n t o da m a t r i z J a c o b i a n a com as d e r i v a d a s p a r c i a i s
A [ 1 ] [ 1 ] = d x f ( x0 ) ; A [ 1 ] [ 2 ] = d y f ( y0 ) ;
175 A [ 2 ] [ 1 ] = dxg ( x0 ) ; A [ 2 ] [ 2 ] = dyg ( y0 ) ;
// p r e e n c h i m e n t o do v e c t o r com as f u n c o e s
177 B [ 1 ] = −f u n c f ( x0 , y0 ) ;
B [ 2 ] = −f u n c g ( x0 , y0 ) ;
179 // a p l i c a as f u n c o e s de e l e m i n c a o de g a u s s e r e s o l u c a o do s i s t e m a l i n e a r
f o r w a r d e l i m ( m a t r i x s i z e , A, L) ;
181
s o l v e ( m a t r i x s i z e , A, L , B,X) ;
// guarda os r e s u l t a d o s
183
x0 = x0 + X [ 1 ] ;
y0 = y0 + X [ 2 ] ;
185
// v e r i f i c a c a o da c o n v e r g e n c i a
i f ( f a b s (X [ 1 ] ) < 0 . 0 0 0 0 0 0 1
| | f a b s (X [ 2 ] ) < 0 . 0 0 0 0 0 0 1 ) break ;
187 // i m p r e s s a o de r e s u l t a d o s
i f ( n == 0 ) p r i n t f ( ” %d
%f
%f
−
%f
−\n” , n , x0 , y0 , maxi ( f a b s (1.39929 − x0 ) , f a b s (0.433232 − y0 ) ) ) ;
189 i f ( n > 0 ) p r i n t f ( ” %d
%f
%f
%f
%f
%f \n” , n , x0 , y0 , maxi ( f a b s ( x0−x n ) , f a b s ( y0−y n ) ) , maxi ( f a b s (1.39929 − x0 ) ,
f a b s (0.433232 − y0 ) ) , maxi ( f a b s (1.39929 − x0 ) , f a b s (0.433232 − y0 ) ) / e n ) ;
28
191 }
// l i b e r t a a memoria a l o c a d a
193
f r e e (A) ;
f r e e (X) ;
195
f r e e (B) ;
f r e e (L) ;
197 // i m p r e s s a o de r e s u l t a d o s
p r i n t f ( ” \nForam n e c e s s a r i a s %d i t e r a d a s a t e a t i n g i r a c o n v e r g e n c i a . \ n\n” , n ) ;
199
system ( ”PAUSE” ) ;
return 0 ;
201 }
29
Download

Relatório de MC