Escolar Documentos
Profissional Documentos
Cultura Documentos
Previsor-Corretor
O mtodo previsor-corretor utilizado para resoluo de Mtodos Lineares de Passo
Mltiplos implcitos. Utilizando um mtodo explicito resolveremos o mtodo implcito e para o
mtodo explicito chamaremos Previsor.
Como mtodo explicito adotamos o Mtodo de Euler
P: yn+1 = yn + hfn
No cdigo do programa ficou
y[0][n+1] = Y[n] + h*f(c1, c2, exp1, exp2, X[n], y[0][n]);
Onde f a funo
float f(float c1, float c2, float exp1, float exp2, float x, float y)
{
return c1*pow(x, exp1) + c2*pow(y,exp2);
}
Foi possvel observar que a medida que aumentamos o intervalo existe uma maior necessidade
de resolver o erro, portanto a medida que que aumentamos o valor de xn o mtodo se torna menos
eficiente.
| y(1)90 - y(0)90 | = 13.960827
| y(2)90 - y(1)90 | = 5.357533
| y(3)90 - y(2)90 | = 3.118959
| y(4)90 - y(3)90 | = 2.164844
| y(5)90 - y(4)90 | = 1.399325
| y(6)90 - y(5)90 | = 0.958065
| y(7)90 - y(6)90 | = 0.634813
| y(8)90 - y(7)90 | = 0.430887
| y(9)90 - y(8)90 | = 0.288076
| y(10)90 - y(9)90 | = 0.194654
| y(11)90 - y(10)90 | = 0.130620
| y(12)90 - y(11)90 | = 0.088069
| y(13)90 - y(12)90 | = 0.059192
| y(14)90 - y(13)90 | = 0.039869
| y(15)90 - y(14)90 | = 0.026815
| y(16)90 - y(15)90 | = 0.018053
| y(17)90 - y(16)90 | = 0.012146
| y(18)90 - y(17)90 | = 0.008175
| y(19)90 - y(18)90 | = 0.005501
| y(20)90 - y(19)90 | = 0.003702
| y(21)90 - y(20)90 | = 0.002491
| y(22)90 - y(21)90 | = 0.001677
| y(23)90 - y(22)90 | = 0.001128
| y(24)90 - y(23)90 | = 0.000759
Y90(x90 = 9.000000) = 8.944349
Cdigo do programa em C
#include <stdio.h>
#include <math.h>
#define NUM 1000
float f(float c1, float c2, float exp1, float exp2, float x, float y)
{
return c1*pow(x, exp1) + c2*pow(y,exp2);
}
void PrevisorCorretor (int n, float c1, float c2, float exp1, float exp2, float
X[], float Y[], float y[][NUM])
{
float h = 0.1;
float E = pow(10, -3);
//PREVISOR
y[0][n+1] = Y[n] + h*f(c1, c2, exp1, exp2, X[n], y[0][n]);
//CORRETOR
int S = 0;
do
{
y[S+1][n+1] = Y[n] + 0.5*h*(f(c1, c2, exp1, exp2, X[n], Y[n]) + f(c1, c2,
exp1, exp2, X[n+1], y[S][n+1]));
//CORRIGINDO ERRO
if (fabs(y[S+1][n+1] - y[S][n+1]) <= E)
Y[n+1] = y[S+1][n+1];
else
S++;
}
while (fabs(y[S+1][n+1] - y[S][n+1]) > E);
printf("Y%d(x%d = %f) = %f \n", n, n, X[n], Y[n]);
printf("s = %d\n", S);
}
int main ()
{
int n, j;
float c1, c2, exp1, exp2, X[NUM], Y[NUM], y[NUM][NUM], i, b, a;
X[0] = 0;
printf("entre com os argumentos Y'(x) = C1*X^exp1 + C2*Y^exp2 \n");
//ENTRADA
printf("C1 = ");
scanf("%f", &c1);
printf("C2 = ");
scanf("%f", &c2);
printf("exp1 = ");
scanf("%f", &exp1);
printf("exp2 = ");
scanf("%f", &exp2);
//PVI
printf("entre com o valor de Y(0) = ");
scanf("%f", &Y[0]);
printf("entre com o intervalo 0 <= X <= b \n");
printf("entre com o valor de b = ");
scanf("%f", &b);
y[0][0] = Y[0];
i = (float)(b)/0.1;
for (j = 0; j <= i; j++)
X[j] = j*0.1;
for (n = 0; n <= i; n++)
PrevisorCorretor (n, c1, c2, exp1, exp2, X, Y, y);
return 0;
}