Sei sulla pagina 1di 14

Introduccin al programa

Mathematica .

RESOLUCIN NUMRICA DE ECUACIONES DIFERENCIALES


Cuando una ecuacin diferencial no se puede resolver de manera exacta (lo cual sucede en la mayora de los
casos), habr que recurrir a procedimientos numricos. En este caso, adems de la ecuacin diferencial y la
condiciones iniciales o de frontera, es necesario especificar el rango de las variables independientes donde
queremos la solucin.
El comando del Mathematica que permite obtener la solucin numrica es NDSolve.
Ejemplo 1: Resuelva el problema de valor inicial y ' = 2 x + y,
y H0L = 2 utilizando los mtodos de Euler explcito, Euler implcito y el mtodo del Trapecio.

Haga lo mismo con el problema y ' = - 104 (y-1), y(0)=2.

MTODO DE EULER EXPLCITO :

x0 = 0;
y0 = 2;
f@x_, y_D := 2 x + y;
h = 0.01;

metEuler@8x_, y_<D := 8x + h, y + h f@x, yD<

p1 = metEuler@8x0, y0<D

80.01, 2.02<

p2 = metEuler@p1D

80.02, 2.0404<

El mtodo de Euler proporciona una solucin discreta, es decir, una serie de puntos de la forma (x_i, y_i) por
lo que pasa la solucin (aproximadamente).

solDis = NestList@metEuler, 8x0, y0<, 20D

880, 2<, 80.01, 2.02<, 80.02, 2.0404<,


80.03, 2.0612<, 80.04, 2.08242<, 80.05, 2.10404<,
80.06, 2.12608<, 80.07, 2.14854<, 80.08, 2.17143<,
80.09, 2.19474<, 80.1, 2.21849<, 80.11, 2.24267<,
80.12, 2.2673<, 80.13, 2.29237<, 80.14, 2.3179<,
80.15, 2.34388<, 80.16, 2.37031<, 80.17, 2.39722<,
80.18, 2.42459<, 80.19, 2.45244<, 80.2, 2.48076<<
Esta es la representacin grfica de la solucin discreta :

12-Mtodos de resolucion de ecuaciones diferenciales.nb

dibaprox = ListPlot@solDisD

2.4

2.3

2.2

2.1

0.05

0.10

0.15

0.20

en este caso podemos calcular la solucin exacta, que nos servir para comparar con ella la solucin discreta.

DSolve@8y'@xD 2 x + y@xD, y@0D 2<, y@xD, xD


88y@xD 2 H-1 + 2 x - xL<<

solExac@x_D := 2 H-1 + 2 x - xL

solExac'@xD - H2 x + solExac@xDL Simplify


0

Grfica de la solucin exacta :

dibexac =
Plot@2 H-1 + 2 x - xL, 8x, 0, 2<, PlotStyle RGBColor@1, 0, 0DD
20

15

10

0.5

1.0

1.5

2.0

Representacin grfica de la solucin exacta (continua), y de la solucin discreta :

12-Mtodos de resolucion de ecuaciones diferenciales.nb

Show@dibaprox, dibexacD

2.4

2.3

2.2

2.1

0.05

0.10

0.15

0.20

Los errores los podemos representar calculando en cada punto la diferencia entre la solucin exacta y el valor
proporcionado por el mtodo de Euler :

ListPlot@solExac@solDis@@All, 1DDD - solDis@@All, 2DDD


0.05

0.04

0.03

0.02

0.01

20

40

60

80

100

Con el otro problema podemos proceder de forma anloga :

x0 = 0;
y0 = 2;
f@x_, y_D := -10^4 Hy - 1L;
h = 0.01;

metEuler@8x_, y_<D := 8x + h, y + h f@x, yD<


metEuler@8x0, y0<D

80.01, -98.<

solDis = NestList@metEuler, 8x0, y0<, 100D;

12-Mtodos de resolucion de ecuaciones diferenciales.nb

dibaprox = ListPlot@solDis, Joined TrueD


4 10133
2 10133

0.2

0.4

0.6

0.8

1.0

-2 10133
-4 10133
-6 10133
-8 10133

DSolve@8y'@xD -10^4 Hy@xD - 1L, y@0D 2<, y@xD, xD


99y@xD -10 000 x I1 + 10 000 xM==
solExact@x_D := 1 + -10 000 x
Grfica de la solucin exacta :

dibexac = PlotA1 + -10 000 x, 8x, 0, 1<,


2.0

PlotStyle 8Thickness@0.01D, RGBColor@1, 0, 0D<E

1.8

1.6

1.4

1.2

0.2

0.4

0.6

0.8

1.0

Podemos observar que las grficas de las soluciones exacta y aproximada difieren enormemente :

Show@dibaprox, dibexacD
4 10133
2 10133

0.2
-2 10133
-4 10133
-6 10133
-8 10133

0.4

0.6

0.8

1.0

12-Mtodos de resolucion de ecuaciones diferenciales.nb

El mtodo de Euler no es un buen mtodo para resolver este problema.

MTODO DE EULER IMPLCITO :


Procedemos a aplicar el mtodo de Euler implcito para resolver el primer problema :

x0 = 0;
y0 = 2;
f@x_, y_D := 2 x + y;
h = 0.01;
y1 y0 + h f@x0 + h, y1D

sol = FindRoot@y1 y0 + h f@x0 + h, y1D, 8y1, y0<D


8y1 2.0204<
sol@@1, 2DD
2.0204

metEulerImplicito@8x_, y_<D :=
Hsol = FindRoot@yn y + h f@x + h, ynD, 8yn, y<D;
8x + h, sol@@1, 2DD<L
metEuler@8x0, y0<D

80.01, 2.02<

metEulerImplicito@8x0, y0<D

80.01, 2.0204<

solDisI = NestList@metEulerImplicito, 8x0, y0<, 200D;


dibaprox = ListPlot@solDisI, Joined TrueD

20

15

10

0.5

1.0

1.5

2.0

12-Mtodos de resolucion de ecuaciones diferenciales.nb

Show@dibaprox, dibexacD

20

15

10

0.5

1.0

1.5

2.0

ListPlot@solExac@solDisI@@All, 1DDD - solDis@@All, 2DDD


20

40

60

80

100

-0.01

-0.02

-0.03

-0.04

-0.05

Y a continuacin lo aplicamos al segundo problema :

x0 = 0;
y0 = 2;
f@x_, y_D := -10^4 Hy - 1L;
h = 0.01;

sol = FindRoot@yn 2 + h f@0 + h, ynD, 8yn, 2<D


8yn 1.0099<
sol@@1, 2DD
1.0099

metEulerImplicito@8x_, y_<D :=
Hsol = FindRoot@yn y + h f@x + h, ynD, 8yn, y<D;
8x + h, sol@@1, 2DD<L
metEuler@8x0, y0<D

80.01, -98.<

metEulerImplicito@8x0, y0<D

80.01, 1.0099<

solDisI = NestList@metEulerImplicito, 8x0, y0<, 100D;

12-Mtodos de resolucion de ecuaciones diferenciales.nb

dibaprox =
ListPlot@solDisI, Joined True, PlotStyle RGBColor@0, 1, 0DD
2.0

1.8

1.6

1.4

1.2

0.2

0.4

0.6

0.8

1.0

Ahora, la solucin aproximada proporcionada por el mtodo de Euler implcito se acerca con bastante exactitud a la solucin exacta :

Show@dibaprox, dibexacD
2.0

1.8

1.6

1.4

1.2

0.2

0.4

0.6

0.8

1.0

Los errores que se cometen son cada vez ms pequeos :

ListPlot@dif = solExact@solDisI@@All, 1DDD - solDisI@@All, 2DDD


20

-0.002

-0.004

-0.006

-0.008

-0.010

40

60

80

100

12-Mtodos de resolucion de ecuaciones diferenciales.nb

dif

90, -0.00990099, -0.0000980296, -9.7059 10-7, -9.6098 10-9,


-9.51466 10-11, -9.42135 10-13, -9.32587 10-15,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,

0.,
0.,
0.,
0.,
0.,
0.,
0.,

0., 0.,
0.,
0.,
0.,
0.,
0.,
0.=

MTODO DEL TRAPECIO :


Resolvemos el primer problema considerando el mtodo del Trapecio :

metTrapecio@8x_, y_<D :=
Hsol = FindRoot@yn y + h 2 Hf@x, yD + f@x + h, ynDL, 8yn, y<D;
8x + h, sol@@1, 2DD<L

x0 = 0;
y0 = 2;
f@x_, y_D := 2 x + y;
h = 0.01;
solExac@x_D := 2 H-1 + 2 x - xL

solDisT = NestList@metTrapecio, 8x0, y0<, 100D;

dibaprox =
ListPlot@solDisT, Joined True, PlotStyle RGBColor@0, 1, 0DD
7

0.2

0.4

0.6

0.8

1.0

12-Mtodos de resolucion de ecuaciones diferenciales.nb

ListPlot@solExac@solDisT@@All, 1DDD - solDisT@@All, 2DDD


20

40

60

80

100

-0.00002

-0.00004

-0.00006

-0.00008

Y ahora, resolvemos el segundo problema considerando el mtodo del Trapecio :

x0 = 0;
y0 = 2;
f@x_, y_D := -10^4 Hy - 1L;
h = 0.01;

solExact@x_D := 1 + -10 000 x;

solDisT = NestList@metTrapecio, 8x0, y0<, 100D;

dibaprox =
ListPlot@solDisT, Joined True, PlotStyle RGBColor@0, 1, 0DD
2.0

1.5

1.0

0.5

0.2

0.4

0.6

0.8

1.0

MTODO DE EULER MEJORADO O MTODO DE HEUN :

10

12-Mtodos de resolucion de ecuaciones diferenciales.nb

metEulerMejorado@8x_, y_<D :=
1
fn = f@x, yD; :x + h, y + h Hfn + f@x + h, y + h fnDL>
2
x0 = 0;
y0 = 2;
f@x_, y_D := 2 x + y;
h = 0.01;
solExac@x_D := 2 H-1 + 2 x - xL

solDisEM = NestList@metEulerMejorado, 8x0, y0<, 100D;


ErrEulerMejorado =
solExac@solDisEM@@All, 1DDD - solDisEM@@All, 2DD;
Max@Abs@ErrEulerMejoradoDD
0.000179864

COMPARACIN DE LOS MTODOS ANTERIORES para el primer problema:

ClearAll@"Global`*"D;

metEuler@8x_, y_<D := 8x + h, y + h f@x, yD<

metEulerImplicito@8x_, y_<D :=
Hsol = FindRoot@yn y + h f@x + h, ynD, 8yn, y<D;
8x + h, sol@@1, 2DD<L

metTrapecio@8x_, y_<D :=
Hsol = FindRoot@yn y + h 2 Hf@x, yD + f@x + h, ynDL, 8yn, y<D;
8x + h, sol@@1, 2DD<L

metEulerMejorado@8x_, y_<D :=
1
fn = f@x, yD; :x + h, y + h Hfn + f@x + h, y + h fnDL>
2
x0 = 0;
y0 = 2;
f@x_, y_D := 2 x + y;
h = 0.01;
solExac@x_D := 2 H-1 + 2 x - xL
npasos = 200;

solDisE = NestList@metEuler, 8x0, y0<, npasosD;

solDisI = NestList@metEulerImplicito, 8x0, y0<, npasosD;


solDisT = NestList@metTrapecio, 8x0, y0<, npasosD;

12-Mtodos de resolucion de ecuaciones diferenciales.nb

solDisEM = NestList@metEulerMejorado, 8x0, y0<, npasosD;

ErrEuler = solExac@solDisE@@All, 1DDD - solDisE@@All, 2DD;


ErrEulerIm = solExac@solDisI@@All, 1DDD - solDisI@@All, 2DD;
ErrTrap = solExac@solDisT@@All, 1DDD - solDisT@@All, 2DD;
ErrEulerMejorado =
solExac@solDisEM@@All, 1DDD - solDisEM@@All, 2DD;
ListPlot@8ErrTrap, ErrEulerMejorado<D
0.0010
0.0008
0.0006
0.0004
0.0002

50

100

150

200

-0.0002
-0.0004

Max@Abs@ErrEulerDD
0.292153
Max@Abs@ErrEulerImDD
0.29905
Max@Abs@ErrTrapDD
0.000492615
Max@Abs@ErrEulerMejoradoDD
0.000977832
COMPARACIN DE LOS MTODOS ANTERIORES para el segundo problema:

ClearAll@"Global`*"D;

metEuler@8x_, y_<D := 8x + h, y + h f@x, yD<

metEulerImplicito@8x_, y_<D :=
Hsol = FindRoot@yn y + h f@x + h, ynD, 8yn, y<D;
8x + h, sol@@1, 2DD<L

metTrapecio@8x_, y_<D :=
Hsol = FindRoot@yn y + h 2 Hf@x, yD + f@x + h, ynDL, 8yn, y<D;
8x + h, sol@@1, 2DD<L
metEulerMejorado@8x_, y_<D :=
1
fn = f@x, yD; :x + h, y + h Hfn + f@x + h, y + h fnDL>
2

11

12

12-Mtodos de resolucion de ecuaciones diferenciales.nb

x0 = 0;
y0 = 2;
f@x_, y_D := -10^4 Hy - 1L;
h = 0.01;

solExac@x_D := 1 + -10 000 x;


npasos = 200;
solDisE = NestList@metEuler, 8x0, y0<, npasosD;

solDisI = NestList@metEulerImplicito, 8x0, y0<, npasosD;


solDisT = NestList@metTrapecio, 8x0, y0<, npasosD;

solDisEM = NestList@metEulerMejorado, 8x0, y0<, npasosD;

ErrEuler = solExac@solDisE@@All, 1DDD - solDisE@@All, 2DD;


ErrEulerIm = solExac@solDisI@@All, 1DDD - solDisI@@All, 2DD;
ErrTrap = solExac@solDisT@@All, 1DDD - solDisT@@All, 2DD;
ErrEulerMejorado =
solExac@solDisEM@@All, 1DDD - solDisEM@@All, 2DD;
ListPlot@8ErrTrap, ErrEulerIm<D
0.015

0.010

0.005

50

100

-0.005

-0.010

-0.015

Max@Abs@ErrEulerDD
1.339796748579625 10399
Max@Abs@ErrEulerImDD
0.00990099
Max@Abs@ErrTrapDD
0.960784
Max@Abs@ErrEulerMejoradoDD
1.140093586324217 10738

150

200

12-Mtodos de resolucion de ecuaciones diferenciales.nb

13

ERRORES LOCALES DE LOS MTODOS :

Clear@x, y, hD;
Series@y@x + hD - Hy@xD + h y'@xDL, 8h, 0, 3<D
H* Euler explcito *L
1

y@xD h2 +

yH3L@xD h3 + O@hD4

2
6
Series@y@x + hD - Hy@xD + h y'@x + hDL, 8h, 0, 3<D
H* Euler implcito *L

yH3L@xD h3 + O@hD4
2
3
Series@y@x + hD - Hy@xD + h 2 Hy'@xD + y'@x + hDLL, 8h, 0, 3<D
H* Mtodo del Trapecio *L
-

y@xD h2 -

yH3L@xD h3 + O@hD4
12
Clear@f, h, yD;
-

SeriesBy@x + hD - y@xD +
H* Euler mejorado *L
1
6

yH3L@xD h3 + O@hD4

1
2

h Hy'@xD + y'@xD + h y''@xDL , 8h, 0, 3<F

Veamos cmo resuelve el segundo problema el Mathematica :

c = 0; solMath = NDSolve@8y'@xD == -10^4 Hy@xD - 1L, y@0D 2<,


y@xD, 8x, 0, 2<, StepMonitor c++D
88y@xD InterpolatingFunction@880., 2.<<, <>D@xD<<
cH* c es un contador que nos permite obtener
el nmero de pasos para resolver el problema*L
108

14

12-Mtodos de resolucion de ecuaciones diferenciales.nb

Plot@solExac@xD - solMath@@1, 1, 2DD, 8x, 0, 2<,


PlotRange All, PlotStyle 8Thickness@0.01D, Red<D
0.5

1.0

1.5

2.0

-1. 10-8

-2. 10-8

-3. 10-8

-4. 10-8

Podemos pedir que trabaje con ms precisin, incrementando tambin el nmero de pasos que puede dar.

c = 0; solMath =
NDSolve@8y'@xD == -10^4 Hy@xD - 1L, y@0D 2<, y@xD, 8x, 0, 2<,
WorkingPrecision 60, MaxSteps 100 000, StepMonitor c++D

88y@xD InterpolatingFunction@880,
2.000000000000000000000000000000000000000000000000000
00000000<<, <>D@xD<<
c
2442

Plot@solExac@xD - solMath@@1, 1, 2DD, 8x, 0, 2<,


PlotRange All, PlotStyle 8Thickness@0.01D, Red<D
4. 10-14

3. 10-14

2. 10-14

1. 10-14

0.5

1.0

1.5

2.0

Potrebbero piacerti anche