1 manualf villar b

Page 1

UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA INGENIERÍA CIVIL

APUNTES DE MÉTODOS NUMÉRICOS

2da Edición


APUNTES DE

MÉTODOS NUMÉRICOS “No busques ser una persona de éxito, busca ser una persona de valores...” Albert Einstein.

Rubén Herrera Galicia Frida Carolina Villalobos Rivas Heri Jacob Villar Sánchez


I.

Solución numérica de ecuaciones de una variable 1. Método de Bisección ……………………………………….………………4 2. Método de Newton Raphson …………………………………..………….11 3. Método de Lin Bairstow …………..………………………………………18

II.

Solución numérica de sistemas de ecuaciones lineales y no lineales 4. Método de Jacobi: Sistemas de ecuaciones no lineales …………..………29 5. Método de Gauss-Seidel …………………………………………….…….52 6. Método de Newton: Sistemas de ecuaciones no lineales …………………72

III.

Interpolación, derivación e integración numérica 7. Interpolación de Newton y Lagrange …………………………………..…83 8. Derivación numérica …………………………………………………..….97 Primera derivada

( )

Segunda derivada

( )

9. Integración numérica ……………………………………………….……109 Método del trapecio Método de Simpson 1/3

IV.

Solución numérica de ecuaciones diferenciales ordinarias 10. Método de Euler y Euler mejorado ………………………….……………117 11. Método de Runge-Kutta (Euler modificado) ……………….…………….126 12. Método de la Serie de Taylor ……………………………….……………132

V.

Solución numérica de ecuaciones en derivadas parciales 13. Método de diferencias finitas ………………………………………….138


UNIVERSIDAD AUTĂ“NOMA DE CHIAPAS FACULTAD DE INGENIERĂ?A

1.- MĂŠtodo de BisecciĂłn đ?‘Ś

đ?‘“(đ?‘Ľ)

đ?‘“(đ?‘Ľ ) đ?‘Ľđ?‘š

đ?‘“(đ?‘Ľ )

đ?‘Ľ

đ?‘Ľđ?‘š

đ?‘Ľ

đ?‘Ľ +đ?‘Ľ đ?‘Ľ

Algoritmo 1. Escoger los valores del intervalo. ] , verificando que 2. Comprobar la existencia de una raĂ­z en el intervalo [ ( ) ( ) de no ser asĂ­, serĂĄ necesario regresar al paso 1 y escoger otros valores para 3. Tomar

y calcular (

.

).

4. Si ( ) , se encontrĂł la raĂ­z de la funciĂłn. Fin del mĂŠtodo. De lo contrario ir al paso 5. 5. Sea T la tolerancia deseada ( el margen de error aceptado), si: se encontrĂł una aproximaciĂłn a la raĂ­z con un margen de error menor a T. Fin del mĂŠtodo. De lo contrario ir al paso 6. 6. Si ( ) ( ) , entonces hacer y repetir desde 3. De lo contrario hacer y repetir desde 3.

4


UNIVERSIDAD AUTĂ“NOMA DE CHIAPAS FACULTAD DE INGENIERĂ?A

En otras palabras: El mĂŠtodo consiste en encontrar la raĂ­z de una funciĂłn f(x) a partir de la bisecciĂłn de dos aproximaciones hechas a la raĂ­z. Sabiendo la grĂĄfica de la funciĂłn facilita su uso, de lo contrario hay que ser abusados, es por eso que la funciĂłn se evalĂşa con las aproximaciones y luego se multiplican para ver que el producto sea negativo ( ( ) ( ) ). Con esto nos damos cuenta si la raĂ­z se encuentra en el intervalo de las aproximaciones dadas. Porque si no estuviera en ese intervalo el producto serĂ­a positivo, ya que el resultado de su evaluaciĂłn seria de signos iguales ya sea ambos negativos o positivos y por lo tanto el intervalo no contendrĂ­a a la raĂ­z, y debemos buscar otros .

đ?‘“(đ?‘Ľ ) đ?‘“(đ?‘Ľ ) > , es positivo, no contiene a la raĂ­z

đ?‘“(đ?‘Ľ ) đ?‘“(đ?‘Ľ ) > , es positivo, no contiene a la raĂ­z

Lo que el mĂŠtodo hace es ir acortando los intervalos, hasta que se hagan tan pequeĂąos que casi son la raĂ­z, y digo casi porque es una aproximaciĂłn a la raĂ­z, o hasta la tolerancia que nosotros tengamos que serĂĄ casi igual a 0 ( ( ) ).

2)

1)

3)

5


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

Programación del método. Ahora que conocemos el método, tendremos la habilidad de pasarlo a una maquina o computadora, es decir crear una aplicación. A continuación se utilizará el programa Builder c++ para la creación de dicha aplicación.

Interfaz propuesta:

Descripción de los botones de la aplicación:

Botón “Calcular producto”: Captura los valores del intervalo, evalúa la función en dichos puntos; calcula el producto y muestra el resultado debajo de la etiqueta ( ) ( ) . Botón “Calcular raíz”: Captura los valores del intervalo y el margen de error aceptado; calcula el valor de y evalúa la función en dicho punto. Si el resultado es igual a cero detiene el proceso y muestra los resultados para , ( ) debajo de la etiqueta correspondiente; de no ser así continúa el proceso calculando:

6


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

Si el resultado es menor al margen de error detiene el proceso y muestra los resultados; de lo contrario continúa, efectuando el producto: ( )

(

)

Si el resultado es menor que cero, asigna a el valor de ( ). Si es mayor que cero asigna a el valor de ( ) y repite el proceso desde el cálculo de Botón “Calcular paso a pasito”: Calcula la raíz de la función paso a paso y muestra los valores obtenidos en cada uno; es decir, captura los valores de del intervalo y calcula: , (

), ( )

(

),

mostrándolos debajo de su respectiva etiqueta. Cuenta el número de iteraciones, además de asignar un nuevo valor ha para realizar las siguientes, dependiendo de la condición: Si ( )

(

)

;(

)

Si ( )

(

)> ;(

)

Botón “Reset”: Reinicia el número de iteraciones y borra los datos escritos en el formulario.

7


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

Código de programación: //---------------------------#include <vcl.h> #pragma hdrstop #include "Unit1.h" //---------------------------#pragma package(smart_init) #pragma resource "*.dfm" #include <math.h> double x1,x2,y1,y2,prod,Tol, aux,ym,xm,delta,i=1,n=1,dif; TForm1 *Form1; //---------------------------__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //---------------------------//botón calcular producto void __fastcall TForm1::Button1Click(TObject *Sender) { x1=Edit1->Text.ToDouble(); x2=Edit2->Text.ToDouble(); y1= x1*x1*x1-x1-1; y2= x2*x2*x2-x2-1; prod=y1*y2; if(prod<0){ Label2->Caption=AnsiString(prod);} else{ Label2->Caption="Escoja otros valores";} } //---------------------------//botón calcular raíz void __fastcall TForm1::Button2Click(TObject *Sender) {

8


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA x1=Edit1->Text.ToDouble(); x2=Edit2->Text.ToDouble(); Tol=Edit3->Text.ToDouble(); aux=0; while (aux!=1){ xm=(x1+x2)/2; ym=xm*xm*xm-xm-1; if(ym==0){aux=1;} delta=fabs((x2-x1)/2); if(delta<Tol){aux=1;} y1= x1*x1*x1-x1-1; prod=y1*ym; if(prod<0){x2=xm;} if(prod>0){x1=xm;} } Label4->Caption=AnsiString(xm); Label5->Caption=AnsiString(ym); } //-------------------------------------------------//botón calcular paso a pasito void __fastcall TForm1::Button3Click(TObject *Sender) { if(i==1){ x1=Edit1->Text.ToDouble(); x2=Edit2->Text.ToDouble();} Label6->Caption=AnsiString(n); Label7->Caption=AnsiString(x1); Label8->Caption=AnsiString(x2); xm=(x1+x2)/2; ym=xm*xm*xm-xm-1; y1= x1*x1*x1-x1-1; prod=y1*ym; dif=(x2-x1)/2; Label9->Caption=AnsiString(xm); Label10->Caption=AnsiString(ym); Label11->Caption=AnsiString(prod); Label12->Caption=AnsiString(dif);

9


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA if(prod<0){x2=xm;} if(prod>0){x1=xm;} n++; i++; } //---------------------------//reset void __fastcall TForm1::Button4Click(TObject *Sender) { i=1; n=1; Label6->Caption=""; Label7->Caption=""; Label8->Caption=""; Label9->Caption=""; Label10->Caption=""; Label11->Caption=""; Label12->Caption=""; } //----------------------------

10


UNIVERSIDAD AUTĂ“NOMA DE CHIAPAS FACULTAD DE INGENIERĂ?A

2.- MĂŠtodo de Newton Raphson Es un mĂŠtodo grĂĄfico para encontrar raĂ­ces de funciones, aplicando la propiedad de la derivada: “El valor de la derivada en un punto es igual a la pendiente de la recta tangente que pasa por ese puntoâ€?. Este mĂŠtodo se basa en la interpretaciĂłn geomĂŠtrica de la derivada para obtener la fĂłrmula de la recurrencia: đ?‘Ś

(

)

(

)

đ?‘“(đ?‘Ľ) đ?‘“(đ?‘Ľđ?‘› ) Pendiente = đ?‘“ (đ?‘Ľđ?‘› ) đ?‘“(đ?‘Ľđ?‘› )

RaĂ­z

đ?‘Ľ

đ?‘Ľđ?‘›

đ?‘Ľđ?‘› đ?‘Ľđ?‘›

Partiendo de una funciĂłn ( (

) , cuya derivada es )

(

đ?‘Ľđ?‘›

) y recordando que:

y

Entonces tenemos lo siguiente: đ?‘“ (đ?‘Ľđ?‘› )

đ?‘“(đ?‘Ľđ?‘› ) đ?‘Ľđ?‘› đ?‘Ľđ?‘›

11


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

Despejando

en la ecuación, obtenemos: ( ) ( )

Que es conocida como la fórmula de Newton-Raphson. Geométricamente lo que está pasando con este método es que al calcular la derivada con un punto dado, está pendiente al cortar con el eje x nos da un nuevo punto el cual está cada vez más cerca de la raíz, y este nuevo nos da otro valor que está mucho más próximo que el anterior, y así sucesivamente hasta acercarse a la raíz o hasta que la deferencia sea cercana a cero.

La fórmula se vuelve a realizar otra vez, cada vez se acerca más a la raíz, por eso se llama de “recurrencia”.

Si observamos en la gráfica se van formando como una especie de zigzag, donde las aproximaciones son cada vez menores y se acercan a la raíz.

Casos especiales ( ) , cuando suceda esto quiere decir que se encontró a la raíz, aunque claro mayormente es un número aproximado a cero. ( ) b) , cuando suceda esto, debemos escoger otro valor para para poder aplicar la formula, ya que no es posible la división entre cero. c) El circulo vicioso, es cuando la derivada nos manda de nuevo al mismo lugar, es decir caemos en un círculo vicioso y nunca encontrará la raíz, porque esta no corta al eje de las x. |>| | d) Divergencia aparente, cuando ,| a)

En la gráfica observamos el caso del círculo vicioso, al cual no tendremos una solución por este método, hay que evitar caer en él.

12


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

Programación del método Interfaz propuesta

Acciones por botón Botón “Calcular raíz”: Lee los valores para y tolerancia, calcula ( ): si ( ) detiene el proceso, pues significa que se encontró la raíz, si ( ) continúa el proceso calculando ( ). Si ( ) detiene el proceso al tratarse de un punto crítico (máximo o mínimo de la función). Si

( )

continúa calculando

(

)

(

)

y sumando 1 al contador de

iteraciones. Dentro de una estructura de repetición „while’ calcula ( ) y condiciones: detener el proceso si un resultado es igual a cero. Si el proceso continuó, calcula:

(

)

(

)

,

|

( ) con las mismas

| y

|

| ;

compara estos últimos y actúa de acuerdo a las siguientes condiciones: 

Si , imprime el mensaje: “Círculo Vicioso. Seleccione otro valor de x1.” y detiene el proceso.

13


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

Si > , imprime el mensaje: “El método diverge aparentemente. Seleccione otro valor de x.” y detiene el proceso.

Si > y > , calcula ( ). Imprime , ( ) debajo de la etiqueta correspondiente y el mensaje “Raíz aproximada”. Detiene el proceso.

En caso de no cumplirse ninguna condición, reasigna valores a las variables: y y reinicia el bucle hasta encontrar la raíz o hasta que se cumpla alguna condición de las arriba mencionadas. Botón “Reset”: Borra los datos escritos en el formulario y reinicia el contador de iteraciones y la variable auxiliar. Posiciona el puntero en el primer Edit.

14


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

Código de programación //---------------------------#include <vcl.h> #pragma hdrstop #include "Unit1.h" //---------------------------#pragma package(smart_init) #pragma resource "*.dfm" #include <math.h> double x1,Tol,n=0,m=0,y1,dy1,x2,y2,dy2,x3,y3,s1,s2; TForm1 *Form1; //---------------------------__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //---------------------------//botón calcular raíz void __fastcall TForm1::Button1Click(TObject *Sender) { x1=Edit1->Text.ToDouble(); Tol=Edit2->Text.ToDouble(); y1=x1*x1*x1-x1-1; if(y1==0){ Label3->Caption=AnsiString(x1); Label4->Caption=AnsiString(y1); m=1;} else{ dy1=3*x1*x1-1; if(dy1==0){ Label5->Caption="x1 es un punto crítico. Seleccione otro valor de x1."; m=1;} else{ x2=x1-(y1/dy1); n++;} }

15


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA while(m!=1){ y2=x2*x2*x2-x2-1; if(y2==0){ Label3->Caption=AnsiString(x2); Label4->Caption=AnsiString(y2); m=1;} else{ dy2=3*x2*x2-1; if(dy2==0){ Label5->Caption="x2 es un punto crítico. Seleccione otro valor de x1."; m=1;} else{ x3=x2-(y2/dy2); n++; s1= fabs(x2-x1); s2= fabs(x3-x2); if(s1==s2){ Label5->Caption="Círculo Vicioso. Seleccione otro valor de x1."; m=1;} else if(s2>s1){ Label5->Caption="El método diverge aparentemente. Seleccione otro valor de x."; m=1;} else if (s2<s1&&Tol>s2){ y3=x3*x3*x3-x3-1; Label3->Caption=AnsiString(x3); Label4->Caption=AnsiString(y3); Label5->Caption="Raíz aproximada."; m=1;} else{ x1=x2; x2=x3;} } } } Label6->Caption = "Iteraciones ”+AnsiString(n); } //----------------------------

16


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

//botón reset void __fastcall TForm1::Button3Click(TObject *Sender) { Label3->Caption=""; Label4->Caption=""; Label5->Caption="Observaciones..."; Label6->Caption=""; Edit1->Text=""; Edit1->SetFocus(); Edit2->Text=""; n=0; m=0; } //---------------------------------------------------------------

De esta forma es como se programaría la aplicación en lenguaje c++.

17


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

3.- Método de Lin-Bairstow “Este método se usa para encontrar raíces de ecuaciones, tanto reales como imaginarias”. Se apoya en la factorización numérica, encontrando raíces por pares, para polinomios de tipo: ( )

+

+

+

+

+

Consideraremos ahora este polinomio de grado ( )

+

+

+

+

+

( )

La idea es factorizar al polinomio ( ) y dejarlo de la siguiente forma ( )

(

+ )(

+

+

+

+

+

)+

+

( )

Se habrá factorizado el polinomio numéricamente cuando y sean ceros o cercanos a cero. Y entonces los factores de + ( ) + serán las raíces del polinomio los cuales se obtienen mediante la fórmula general. Al hacer el producto del polinomio (2) tenemos

( )

+

+

+

+

+

+

+

+

+

… +

+

+

+

+

+

+

+ +

Al hacer el producto nos da términos semejantes, son los que se señalan con una flecha.

+

…(Residuo)

18


UNIVERSIDAD AUTĂ“NOMA DE CHIAPAS FACULTAD DE INGENIERĂ?A

Se igualan los coeficientes de ambas funciones (1) y (2), ya que son iguales y tenemos

+ +

+

+

+

‌ +

+

+ Donde se observa la siguiente regla: +

+

Con excepciĂłn de Ahora despejamos a “bâ€? en cada una

La condiciĂłn para que el polinomio sea factorizable es que đ?‘?đ?‘› y đ?‘?đ?‘›

‌

La condiciĂłn para la factorizaciĂłn del polinomio es que lo tanto:

y

sean iguales a cero, por

( )

( )

Despejando a p de la ecuaciĂłn (3) y a q de la ecuaciĂłn (2)

( )

( )

Donde đ?‘?đ?‘›

19


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

Para definir el error tenemos las siguientes ecuaciones Dr. Herrera:

Valor inicial

A partir de aquí todas las fórmulas las anexé yo porque en el anterior no estaban todas

Valor recién

Sustituyendo la ecuación (5) en el valor de p recién calculado, tenemos

( )

Si corremos raya del lado derecho nos damos cuenta que el término es semejante a El numerador es igual a 𝑏𝑛

Sustituyendo en la ecuación a

y despejando a

+

tenemos la siguiente fórmula:

( )

De la misma manera con la ecuación (6) al realizar lo anterior llegamos a la siguiente fórmula:

+

( )

Las cuales son las fórmulas que usará este método para calcular los nuevos valores que deben tomar p y q para que el polinomio pueda ser factorizable y de esta manera encontrar las raíces buscadas del polinomio. La ventaja que tiene este método es que podemos encontrar las raíces tanto reales como imaginarias del polinomio, esto se puede conocer mediante la aplicación de la fórmula general a los valores para los cuales es factorizable la función ( ) en el polinomio cuadrático ( + + ) Se puede decir que: Polinomio de orden n

Función

Polinomio de orden n-2

Residu

Par de raíces

20


UNIVERSIDAD AUTĂ“NOMA DE CHIAPAS FACULTAD DE INGENIERĂ?A

Algoritmo: Hacer đ?‘? đ?‘ž y leer đ?‘Ž đ?‘Ž đ?‘Ž đ?‘Ž đ?‘Ž đ?‘Ž đ?‘‡.

Calcular: đ?‘? đ?‘? đ?‘? đ?‘? đ?‘? đ?‘?

Checar đ?‘?

No

Si

Calcular đ?‘? đ?‘Ś đ?‘ž

Nanchy

Checar que

|đ?‘? |đ?‘ž

đ?‘?| đ?‘ž|

�, �

No

Hacer đ?‘?

đ?‘ž

đ?‘?, đ?‘ž

Si

Text

Estos son los pasos a seguir del mĂŠtodo de Lin-bairstow, el cual nos es Ăştil para conocer las raĂ­ces imaginarias de un polinomio si es que las contiene. Cabe recordar que las raĂ­ces imaginarias siempre vienen dadas por parejas ya que existe el conjugado por cada raĂ­z imaginaria encontrada. EstĂĄ adaptado para un polinomio de grado n=5, para otros polinomios se usan hasta đ?‘Žđ?‘›

21


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

Programación Interfaz gráfica propuesta:

Programación por botón: Botón “Paso a pasito”: Lee los valores para , la tolerancia, y si se requiere, también de y , de lo contrario su valor inicial es cero. Calcula y con las fórmulas anteriormente mencionadas; si es igual a cero muestra un mensaje advirtiendo que el método no funciona con el polinomio indicado, en caso contrario calcula los valores de y y los nuevos valores para y . Determina el valor absoluto de y y toma el mayor de ellos como error y si éste es menor que la tolerancia establecida muestra un mensaje en el formulario. Imprime , el error y el número de iteraciones del método. Botón “De una patada”: Lee los valores para , la tolerancia, y si se requiere, también de y , de lo contrario su valor inicial es cero. Dentro de una estructura de repetición „while’

22


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

calcula y ; si es igual a cero imprime un mensaje advirtiendo que el método no funciona con el polinomio indicado y detiene el proceso, en caso contrario continúa calculando los valores de y y los nuevos valores para y . Determina el valor absoluto de y y toma el mayor de ellos como error y si éste es menor que la tolerancia establecida imprime un mensaje en el formulario y detiene el proceso, de lo contrario inicia nuevamente los cálculos, con los nuevos valores de y . Si el contador de iteraciones es mayor que 200 muestra un mensaje advirtiendo que el método no converge para el polinomio indicado. Imprime , el error y el número de iteraciones del método. Botón “Calcular raíces”: Calcula las dos primeras raíces del polinomio con la fórmula general, utilizando los valores de y como b y c, respectivamente, siendo a=1. Calcula el valor del discriminante y si este es menor que cero, utiliza el valor absoluto y calcula la parte real y la parte imaginaria de la raíz, imprimiéndolas en el Edit correspondiente. De lo contrario, calcula las raíces reales y las imprime en el Edit que corresponde. Botón “Reset”: Borra todos los datos escritos en el formulario y reinicia el contador de iteraciones y la variable auxiliar. Posiciona el puntero en el puntero en el primer Edit.

23


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

Código de programación //---------------------------------------------------------------#include <vcl.h> #pragma hdrstop #include "Unit1.h" //---------------------------------------------------------------#pragma package(smart_init) #pragma resource "*.dfm" #include <math.h> double a0,a1,a2,a3,a4,a5,b0,b1,b2,b3,b4,b5,p,q,Tol,deltap,deltaq, p2,q2,error,m,i,k=0,d,rx1,rx2,ixr,ix; TForm1 *Form1; //---------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //---------------------------------------------------------------//paso a pasito void __fastcall TForm1::Button1Click(TObject *Sender) { if(k==0){i=0;} if(i==0) { a0=Edit1->Text.ToDouble(); a1=Edit2->Text.ToDouble(); a2=Edit3->Text.ToDouble(); a3=Edit4->Text.ToDouble(); a4=Edit5->Text.ToDouble(); a5=Edit6->Text.ToDouble(); Tol=Edit7->Text.ToDouble(); if(CheckBox1->Checked==True){ p=Edit14->Text.ToDouble(); q=Edit15->Text.ToDouble();} else{ p=0; q=0;} } b0=a0; b1=a1-p*b0;

24


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA b2=a2-p*b1-q*b0; b3=a3-p*b2-q*b1; b4=a4-p*b3-q*b2; b5=a5-q*b3; if(b3==0){ Label6->Caption="El método no funciona para el polinomio indicado.";} else { deltap=(b4/b3); deltaq=(b5/b3); p2=deltap+p; q2=deltaq+q; deltap= fabs(deltap); deltaq= fabs(deltaq); if(deltap < deltaq){error=deltaq;} else{error=deltap;} if (error<Tol){ Label6->Caption="El error es menor a la tolerancia establecida.";} p=p2; q=q2; } Edit8->Text=AnsiString(b0); Edit9->Text=AnsiString(b1); Edit10->Text=AnsiString(b2); Edit11->Text=AnsiString(b3); Edit12->Text=AnsiString(b4); Edit13->Text=AnsiString(b5); Edit14->Text=AnsiString(p); Edit15->Text=AnsiString(q); Edit16->Text=AnsiString(error); Label7->Caption="Iteraciones: "+AnsiString(i); i++; k++; } //---------------------------------------------------------------//de una patada void __fastcall TForm1::Button2Click(TObject *Sender)

25


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA { a0=Edit1->Text.ToDouble(); a1=Edit2->Text.ToDouble(); a2=Edit3->Text.ToDouble(); a3=Edit4->Text.ToDouble(); a4=Edit5->Text.ToDouble(); a5=Edit6->Text.ToDouble(); Tol=Edit7->Text.ToDouble(); i=0; m=0; if(CheckBox1->Checked==True){ p=Edit14->Text.ToDouble(); q=Edit15->Text.ToDouble();} else{ p=0; q=0;} while(m!=1){ b0=a0; b1=a1-p*b0; b2=a2-p*b1-q*b0; b3=a3-p*b2-q*b1; b4=a4-p*b3-q*b2; b5=a5-q*b3; if(b3==0){ Label6->Caption="El método no funciona para el polinomio indicado."; m=1;} else{ deltap=(b4/b3); deltaq=(b5/b3); p2=deltap+p; q2=deltaq+q; deltap= fabs(deltap); deltaq= fabs(deltaq); if(deltap < deltaq){error=deltaq;} else{error=deltap;} if (error<Tol){ Label6->Caption="El error es menor a la tolerancia establecida."; m=1;} else{ p=p2; q=q2; i++;}

26


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA if(i>200){ Label6->Caption="El método no converge para dicha función."; m=1;} } } Edit8->Text=AnsiString(b0); Edit9->Text=AnsiString(b1); Edit10->Text=AnsiString(b2); Edit11->Text=AnsiString(b3); Edit12->Text=AnsiString(b4); Edit13->Text=AnsiString(b5); Edit14->Text=AnsiString(p); Edit15->Text=AnsiString(q); Edit16->Text=AnsiString(error); Label7->Caption="Iteraciones: "+AnsiString(i); k=0; } //---------------------------------------------------------------//calcular raíces void __fastcall TForm1::Button3Click(TObject *Sender) { p=Edit14->Text.ToDouble(); q=Edit15->Text.ToDouble(); d=p*p-(4*q); if(d>=0) { rx1=(-p+(pow(d,0.5)))/2; rx2=(-p-(pow(d,0.5)))/2; Edit17->Text=AnsiString(rx1); Edit18->Text=AnsiString(rx2);} else{ d=fabs(d); //parte real de la raíz ixr=-p/2; //parte imaginaria de la raíz ix=(pow(d,0.5))/2; Edit19->Text=FormatFloat("0.####",ixr)+ " + " + FormatFloat("0.####",ix)+" i"; Edit20->Text=FormatFloat("0.####",ixr)+ " - " + FormatFloat("0.####",ix)+" i";

27


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA } } //---------------------------------------------------------------//reset void __fastcall TForm1::Button4Click(TObject *Sender) { Edit1->Text=""; Edit2->Text=""; Edit3->Text=""; Edit4->Text=""; Edit5->Text=""; Edit6->Text=""; Edit7->Text=""; Edit8->Text=""; Edit9->Text=""; Edit10->Text=""; Edit11->Text=""; Edit12->Text=""; Edit13->Text=""; Edit14->Text=""; Edit15->Text=""; Edit16->Text=""; Edit17->Text=""; Edit18->Text=""; Edit19->Text=""; Edit20->Text=""; Edit1->SetFocus(); CheckBox1->Checked=False; Label6->Caption="Observaciones..."; Label7->Caption="Número de iteraciones."; i=0; k=0; } //----------------------------------------------------------------

28


UNIVERSIDAD AUTĂ“NOMA DE CHIAPAS FACULTAD DE INGENIERĂ?A

4.- MĂŠtodo de Jacobi

Este mĂŠtodo nos sirve para resolver ecuaciones lineales. Supongamos el siguiente sistema de ecuaciones: +

+

+

+

+

+

+

+

+

+

+

+

Este mĂŠtodo trata de calcular un nuevo valor para cada variable, tomando como base el sistema de ecuaciones, para desarrollar las fĂłrmulas debemos despejar una variable por cada ecuaciĂłn, con ellas obtendremos los nuevos valores que nos acercaran a las soluciones del sistema: Las condiciones que se deben cumplir son: đ?‘Ž đ?‘? đ?‘? đ?‘‘

Para que se pueda desarrollar este mĂŠtodo, los coeficientes de la diagonal deben ser distintos de cero:

A las ecuaciones anteriores tambiĂŠn la podemos representar de la siguiente manera, es decir le podemos dar la siguiente correspondencia:

29


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

Esta son las fórmulas que usará este método para calcular los nuevos valores de cada una de las variables, esta acción se llevará a cabo hasta que lleguemos a la tolerancia o una aproximación cercana a cero. Para ello nos ayudamos en la siguiente fórmula de error. |

|

|

|

|

|

|

|

Donde el criterio de paro será: (

)

Convergencia del método Para que lleguemos a la solución es indispensable que sea convergente, de lo contrario no llegaremos al resultado deseado. Para saber si el sistema es convergente, lo debemos de tomar como un tipo de matriz:

[

]

Si la matriz de coeficientes originales del sistema de ecuaciones es diagonalmente dominante, es muy probable que el método sea convergente para dicho sistema. Una matriz se dice matriz diagonalmente dominante, si en cada uno de los renglones, el valor absoluto del elemento de la diagonal principal es mayor que la suma de los valores absolutos de los elementos restantes del mismo renglón.

30


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

A veces la matriz de un sistema de ecuaciones no es diagonalmente dominante pero cuando se cambian el orden de las ecuaciones o las incógnitas el nuevo sistema puede tener matriz de coeficientes diagonalmente dominante. La matriz es fuertemente dominante si: |

|>| |+|

|+|

|

| |> | |+| |+| | | |>| |+| |+| | |

|>|

|+|

|+|

|

Otra forma de especificarlo es de la siguiente manera: | |+| |

|+| |

|

| |+| |+| | | | | |+| |+| | | | |

|+| |

|+| |

|

Calculando: | |+| |

|+| |

|

| |+| |+| | | | | |+| |+| | | | |

|+| |

|+| |

|

Teniendo estas ecuaciones podemos saber si un sistema es fuerte o débilmente dominante, o en su defecto que sea aparentemente dominante o no dominante.

31


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

Recordemos que: “Reordenar el sistema y colocar en la diagonal los coeficientes de mayor valor absoluto, ello puede hacer converger hacia la solución” Ahora podemos decir lo siguiente de un sistema: a).- Fuertemente dominante: (

)

(

)

(

)

(

)

b).- Débilmente dominante: ( Donde

+

)

(

+

+

)

(

)

(

)

(

)

Esta son las condiciones que debe cumplir el sistema para que el método pueda converger a una raíz o solución del sistema, mientras el sistema sea convergente llegaremos a una solución, se pueden tomar distintas rutas, pero si todas convergen, entonces llegaremos a una solución.

Valores iniciales

De esta forma sabremos si el sistema converge a una solución, de lo contrario el método no nos garantiza encontrar la solución al sistema de ecuaciones.

32


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

Programación: Interfaz gráfica propuesta

Interpretación por botón: Botón “2x2”: El formulario muestra por defecto un arreglo matricial de 4x4, al presionar el botón oculta y reordena los Edits del formulario, de tal forma que se muestre sólo un arreglo de 2x2; oculta también todos los Edits relacionados con las variables que no forman parte del sistema de ecuaciones. Botón “3x3”: Oculta y reordena los Edits del formulario, de tal forma que se muestre sólo un arreglo matricial de 3x3; oculta también todos los Edits relacionados con las variables que no forman parte del sistema de ecuaciones.

33


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

Botón “4x4”: Muestra y reordena todos los Edits del formulario, en la forma en que se encontraban originalmente. Botón “Capturar/convergencia”: Para un arreglo de 4x4: Lee los datos de la matriz formada por el sistema de ecuaciones: . Para un arreglo de 3x3: Lee los datos de la matriz formada por el sistema de ecuaciones: . Para un arreglo de 2x2: Lee los datos de la matriz formada por el sistema de ecuaciones: . Comprueba que los elementos de la diagonal sean iguales a cero, si alguno cumple esa condición imprime una advertencia diciendo que los elementos de la diagonal principal deben ser distintos de cero y desactiva los botones “Calcular aproximación” y “Calcular paso a pas0”. De lo contrario comprueba que la matriz sea dominante, comparando los elementos de la diagonal con los demás:  Si el valor absoluto de cada elemento de la diagonal es mayor a la suma de los valores absolutos de los demás elementos de la fila donde se encuentra, imprime un mensaje diciendo que la matriz es fuertemente dominante.  Si el valor absoluto de uno o más elementos de la diagonal es igual a la suma de los valores absolutos de los demás elementos de la fila donde se encuentra, sin que ninguno sea menor que dicha suma, imprime un mensaje diciendo que la matriz es débilmente dominante.  Si no cumple ninguna condición quiere decir que no es una matriz dominante por lo que es posible que el método no sea convergente para la matriz en cuestión, por lo que imprime un mensaje que advierte que no se garantiza la convergencia del método, y desactiva el botón “Calcular aproximación”. Por último normaliza los coeficientes de las ecuaciones anteriormente mostradas, con los datos necesarios, dependiendo del orden de la matriz. Botón “Calcular aproximación”: Lee el valor de la tolerancia deseada y los valores iniciales de las variables a calcular, dependiendo del orden de la matriz.

34


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

 Para matrices de orden 4x4:  Para matrices de orden 3x3:  Para matrices de orden 2x2:

. . .

Dentro de una estructura de repetición „while’ : Calcula nuevos valores para cada una con las ecuaciones anteriormente descritas y calcula el error para cada una de ellas, restando el valor inicial al recién calculado. Compara los valores absolutos de los errores con la tolerancia establecida y si todos son menores a ésta, imprime un mensaje señalando que se ha encontrado una aproximación, sustituye los nuevos valores en las ecuaciones originales para comprobar los resultados y los imprime, al igual que los valores recién calculados y el error de cada uno en los Edits correspondientes. También muestra un mensaje con el número de iteraciones realizadas y detiene el proceso. De no cumplir la condición: Reasigna valores a las variables, siendo ahora el valor inicial igual al recién calculado ( ) y aumenta en uno el contador de iteraciones. Reinicia el proceso. Botón “Calcular paso a paso”: La primera vez que se pulsa: Lee el valor de la tolerancia deseada y los valores iniciales de las variables a calcular, dependiendo del orden de la matriz.  Para matrices de orden 4x4: .  Para matrices de orden 3x3: .  Para matrices de orden 2x2: . En las siguientes iteraciones toma como valor inicial el valor recién calculado en las operaciones efectuadas. Calcula nuevos valores para cada una con las ecuaciones anteriormente descritas y calcula el error para cada una de ellas, restando el valor inicial al recién calculado. Compara los valores absolutos de los errores con la tolerancia establecida y si todos son menores a ésta, imprime un mensaje señalando que se ha encontrado una aproximación. Sustituye los nuevos valores en las ecuaciones originales para comprobar los resultados. Reasigna valores a las variables, siendo ahora el valor inicial igual al recién calculado ( ). Imprime los valores recién calculados, sus respectivos errores y el valor de la ecuación en función de los nuevos valores en los Edits correspondientes. También imprime un mensaje con el número de iteraciones, y aumenta en uno el contador.

35


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

Código de programación: //---------------------------------------------------------------#include <vcl.h> #pragma hdrstop #include "Unit1.h" //---------------------------------------------------------------#pragma package(smart_init) #pragma resource "*.dfm" #include <math.h> double n=4,m,k,a0,a1,a2,a3,b0,b1,b2,b3,c0,c1,c2,c3,d0,d1,d2,d3,f0,f1,f2,f 3,s1,s2,s3,s4,q1,q2,q3,q4,F0,F1,F2,F3,A1,A2,A3,B0,B2,B3,C0,C1,C3,D 0,D1,D2,x1,x2,y1,y2,z1,z2,w1,w2,tol,F01,F11,F21,F31,dx,dy,dz,dw, Dx,Dy,Dz,Dw,i,aux; TForm1 *Form1; //---------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //---------------------------------------------------------------//botón 2x2 void __fastcall TForm1::Button5Click(TObject *Sender) { Image1->Visible=false; Image38->Visible=false; Image39->Visible=true; Image2->Left=352; Image3->Left=448; Image7->Left=352; Image8->Left=448; Image4->Visible=false; Image5->Visible=false; Image9->Visible=false; Image10->Visible=false; Image12->Visible=false; Image13->Visible=false; Image14->Visible=false; Image15->Visible=false; Image16->Visible=false; Image17->Visible=false;

36


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA Image18->Visible=false; Image19->Visible=false; Image20->Visible=false; Image21->Visible=false; Image24->Visible=false; Image25->Visible=false; Image28->Visible=false; Image29->Visible=false; Image32->Visible=false; Image33->Visible=false; Image36->Visible=false; Image37->Visible=false; Edit1->Left=328; Edit2->Left=424; Edit6->Left=328; Edit7->Left=424; Edit3->Visible=false; Edit4->Visible=false; Edit8->Visible=false; Edit9->Visible=false; Edit11->Visible=false; Edit12->Visible=false; Edit13->Visible=false; Edit14->Visible=false; Edit15->Visible=false; Edit16->Visible=false; Edit17->Visible=false; Edit18->Visible=false; Edit19->Visible=false; Edit20->Visible=false; Edit23->Visible=false; Edit24->Visible=false; Edit28->Visible=false; Edit29->Visible=false; Edit32->Visible=false; Edit33->Visible=false; Edit36->Visible=false; Edit37->Visible=false; Edit1->SetFocus(); n=2; } //---------------------------------------------------------------//botón 3x3 void __fastcall TForm1::Button6Click(TObject *Sender) {

37


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA Image1->Visible=false; Image38->Visible=true; Image39->Visible=false; Image2->Left=256; Image3->Left=352; Image4->Left=448; Image7->Left=256; Image8->Left=352; Image9->Left=448; Image12->Left=256; Image13->Left=352; Image14->Left=448; Image4->Visible=true; Image5->Visible=false; Image9->Visible=true; Image10->Visible=false; Image12->Visible=true; Image13->Visible=true; Image14->Visible=true; Image15->Visible=false; Image16->Visible=true; Image17->Visible=false; Image18->Visible=false; Image19->Visible=false; Image20->Visible=false; Image21->Visible=false; Image24->Visible=true; Image25->Visible=false; Image28->Visible=true; Image29->Visible=false; Image32->Visible=true; Image33->Visible=false; Image36->Visible=true; Image37->Visible=false; Edit1->Left=232; Edit2->Left=328; Edit3->Left=424; Edit6->Left=232; Edit7->Left=328; Edit8->Left=424; Edit11->Left=232; Edit12->Left=328; Edit13->Left=424; Edit3->Visible=true; Edit4->Visible=false; Edit8->Visible=true; Edit9->Visible=false; Edit11->Visible=true;

38


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA Edit12->Visible=true; Edit13->Visible=true; Edit14->Visible=false; Edit15->Visible=true; Edit16->Visible=false; Edit17->Visible=false; Edit18->Visible=false; Edit19->Visible=false; Edit20->Visible=false; Edit23->Visible=true; Edit24->Visible=false; Edit28->Visible=true; Edit29->Visible=false; Edit32->Visible=true; Edit33->Visible=false; Edit36->Visible=true; Edit37->Visible=false; Edit1->SetFocus(); n=3; } //---------------------------------------------------------------//botón 4x4 void __fastcall TForm1::Button7Click(TObject *Sender) { Image1->Visible=true; Image38->Visible=false; Image39->Visible=false; Image2->Left=160; Image3->Left=256; Image4->Left=352; Image5->Left=448; Image7->Left=160; Image8->Left=256; Image9->Left=352; Image10->Left=448; Image12->Left=160; Image13->Left=256; Image14->Left=352; Image15->Left=448; Image4->Visible=true; Image5->Visible=true; Image9->Visible=true; Image10->Visible=true; Image12->Visible=true; Image13->Visible=true;

39


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA Image14->Visible=true; Image15->Visible=true; Image16->Visible=true; Image17->Visible=true; Image18->Visible=true; Image19->Visible=true; Image20->Visible=true; Image21->Visible=true; Image24->Visible=true; Image25->Visible=true; Image28->Visible=true; Image29->Visible=true; Image32->Visible=true; Image33->Visible=true; Image36->Visible=true; Image37->Visible=true; Edit1->Left=136; Edit2->Left=232; Edit3->Left=328; Edit4->Left=424; Edit6->Left=136; Edit7->Left=232; Edit8->Left=328; Edit9->Left=424; Edit11->Left=136; Edit12->Left=232; Edit13->Left=328; Edit14->Left=424; Edit3->Visible=true; Edit4->Visible=true; Edit8->Visible=true; Edit9->Visible=true; Edit11->Visible=true; Edit12->Visible=true; Edit13->Visible=true; Edit14->Visible=true; Edit15->Visible=true; Edit16->Visible=true; Edit17->Visible=true; Edit18->Visible=true; Edit19->Visible=true; Edit20->Visible=true; Edit23->Visible=true; Edit24->Visible=true; Edit28->Visible=true; Edit29->Visible=true; Edit32->Visible=true; Edit33->Visible=true; Edit36->Visible=true;

40


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA Edit37->Visible=true; Edit1->SetFocus(); n=4; } //---------------------------------------------------------------//botón capturar/convergencia void __fastcall TForm1::Button1Click(TObject *Sender) { if(n==4){ a0=Edit1->Text.ToDouble(); a1=Edit2->Text.ToDouble(); a2=Edit3->Text.ToDouble(); a3=Edit4->Text.ToDouble(); f0=Edit5->Text.ToDouble(); b0=Edit6->Text.ToDouble(); b1=Edit7->Text.ToDouble(); b2=Edit8->Text.ToDouble(); b3=Edit9->Text.ToDouble(); f1=Edit10->Text.ToDouble(); c0=Edit11->Text.ToDouble(); c1=Edit12->Text.ToDouble(); c2=Edit13->Text.ToDouble(); c3=Edit14->Text.ToDouble(); f2=Edit15->Text.ToDouble(); d0=Edit16->Text.ToDouble(); d1=Edit17->Text.ToDouble(); d2=Edit18->Text.ToDouble(); d3=Edit19->Text.ToDouble(); f3=Edit20->Text.ToDouble(); if(a0==0||b1==0||c2==0||d3==0){ Label3->Caption="Los elementos de la diagonal principal deben ser distintos de cero."; Button2->Enabled=false; Button3->Enabled=false; } else{ s1= s2= s3= s4=

fabs(a1)+fabs(a2)+fabs(a3); fabs(b0)+fabs(b2)+fabs(b3); fabs(c0)+fabs(c1)+fabs(c3); fabs(d0)+fabs(d1)+fabs(d2);

41


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA q1=s1/fabs(a0); q2=s2/fabs(b1); q3=s3/fabs(c2); q4=s4/fabs(d3); m=q1+q2+q3+q4; if(q1<1&&q2<1&&q3<1&&q4<1){ Label3->Caption="La matriz es fuertemente dominante."; Button2->Enabled=true; Button3->Enabled=true;} else if(q1<=1&&q2<=1&&q3<=1&&q4<=1&&m<4){ Label3->Caption="La matriz es débilmente dominante."; Button2->Enabled=true; Button3->Enabled=true;} else{ Label3->Caption="El método no garantiza convergencia."; Button2->Enabled=false; Button3->Enabled=true;} A1=a1/a0; A2=a2/a0; A3=a3/a0; F0=f0/a0; B0=b0/b1; B2=b2/b1; B3=b3/b1; F1=f1/b1; C0=c0/c2; C1=c1/c2; C3=c3/c2; F2=f2/c2; D0=d0/d3; D1=d1/d3; D2=d2/d3; F3=f3/d3;}} else if(n==3){ a0=Edit1->Text.ToDouble(); a1=Edit2->Text.ToDouble(); a2=Edit3->Text.ToDouble(); f0=Edit5->Text.ToDouble(); b0=Edit6->Text.ToDouble();

42


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA b1=Edit7->Text.ToDouble(); b2=Edit8->Text.ToDouble(); f1=Edit10->Text.ToDouble(); c0=Edit11->Text.ToDouble(); c1=Edit12->Text.ToDouble(); c2=Edit13->Text.ToDouble(); f2=Edit15->Text.ToDouble(); if(a0==0||b1==0||c2==0){ Label3->Caption="Los elementos de la diagonal principal deben ser distintos de cero."; Button2->Enabled=false; Button3->Enabled=false;} else{ s1= fabs(a1)+fabs(a2); s2= fabs(b0)+fabs(b2); s3= fabs(c0)+fabs(c1); q1=s1/fabs(a0); q2=s2/fabs(b1); q3=s3/fabs(c2); m=q1+q2+q3; if(q1<1&&q2<1&&q3<1) { Label3->Caption="La matriz es fuertemente dominante."; Button2->Enabled=true; Button3->Enabled=true;} else if(q1<=1&&q2<=1&&q3<=1&&m<3){ Label3->Caption="La matriz es débilmente dominante."; Button2->Enabled=true; Button3->Enabled=true;} else{ Label3->Caption="El método no garantiza convergencia."; Button2->Enabled=false; Button3->Enabled=true;} A1=a1/a0; A2=a2/a0; F0=f0/a0; B0=b0/b1; B2=b2/b1; F1=f1/b1; C0=c0/c2;

43


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA C1=c1/c2; F2=f2/c2;}} else { a0=Edit1->Text.ToDouble(); a1=Edit2->Text.ToDouble(); f0=Edit5->Text.ToDouble(); b0=Edit6->Text.ToDouble(); b1=Edit7->Text.ToDouble(); f1=Edit10->Text.ToDouble(); if(a0==0||b1==0){ Label3->Caption="Los elementos de la diagonal principal deben ser distintos de cero."; Button2->Enabled=false; Button3->Enabled=false;} else{ s1= fabs(a1); s2= fabs(b0); q1=s1/fabs(a0); q2=s2/fabs(b1); m=q1+q2; if(q1<1&&q2<1){ Label3->Caption="La matriz es fuertemente dominante. :)"; Button2->Enabled=true; Button3->Enabled=true;} else if(q1<=1&&q2<=1&&m<2){ Label3->Caption="La matriz es débilmente dominante. :("; Button2->Enabled=true; Button3->Enabled=true;} else{ Label3->Caption="El método no garantiza convergencia. :/"; Button2->Enabled=false; Button3->Enabled=true;} A1=a1/a0; F0=f0/a0; B0=b0/b1; F1=f1/b1;}} i=0; k=0; }

44


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA //---------------------------------------------------------------//botón calcular aproximación void __fastcall TForm1::Button2Click(TObject *Sender) { i=0; aux=0; if(n==4){ x1=Edit21->Text.ToDouble(); y1=Edit22->Text.ToDouble(); z1=Edit23->Text.ToDouble(); w1=Edit24->Text.ToDouble(); tol=Edit25->Text.ToDouble(); while(aux!=1){ x2=F0-(A1*y1)-(A2*z1)-(A3*w1); y2=F1-(B0*x1)-(B2*z1)-(B3*w1); z2=F2-(C0*x1)-(C1*y1)-(C3*w1); w2=F3-(D0*x1)-(D1*y1)-(D2*z1); dx=x2-x1; dy=y2-y1; dz=z2-z1; dw=w2-w1; Dx=fabs(dx); Dy=fabs(dy); Dz=fabs(dz); Dw=fabs(dw); if(Dx<tol&&Dy<tol&&Dz<tol&&Dw<tol) { Label4->Caption="¡Se encontró una aproximación!"; F01=(a0*x2)+(a1*y2)+(a2*z2)+(a3*w2); F11=(b0*x2)+(b1*y2)+(b2*z2)+(b3*w2); F21=(c0*x2)+(c1*y2)+(c2*z2)+(c3*w2); F31=(d0*x2)+(d1*y2)+(d2*z2)+(d3*w2); Edit26->Text=AnsiString(x2); Edit27->Text=AnsiString(y2); Edit28->Text=AnsiString(z2); Edit29->Text=AnsiString(w2); Edit30->Text=AnsiString(dx); Edit31->Text=AnsiString(dy); Edit32->Text=AnsiString(dz); Edit33->Text=AnsiString(dw); Edit34->Text=AnsiString(F01); Edit35->Text=AnsiString(F11);

45


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA Edit36->Text=AnsiString(F21); Edit37->Text=AnsiString(F31); aux=1;} x1=x2; y1=y2; z1=z2; w1=w2; i++;}} else if(n==3){ x1=Edit21->Text.ToDouble(); y1=Edit22->Text.ToDouble(); z1=Edit23->Text.ToDouble(); tol=Edit25->Text.ToDouble(); while(aux!=1){ x2=F0-(A1*y1)-(A2*z1); y2=F1-(B0*x1)-(B2*z1); z2=F2-(C0*x1)-(C1*y1); dx=x2-x1; dy=y2-y1; dz=z2-z1; Dx=fabs(dx); Dy=fabs(dy); Dz=fabs(dz); if(Dx<tol&&Dy<tol&&Dz<tol) { Label4->Caption="¡Se encontró una aproximación!"; F01=(a0*x2)+(a1*y2)+(a2*z2); F11=(b0*x2)+(b1*y2)+(b2*z2); F21=(c0*x2)+(c1*y2)+(c2*z2); Edit26->Text=AnsiString(x2); Edit27->Text=AnsiString(y2); Edit28->Text=AnsiString(z2); Edit30->Text=AnsiString(dx); Edit31->Text=AnsiString(dy); Edit32->Text=AnsiString(dz); Edit34->Text=AnsiString(F01); Edit35->Text=AnsiString(F11); Edit36->Text=AnsiString(F21); aux=1;} x1=x2; y1=y2; z1=z2;

46


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA i++;}} else { x1=Edit21->Text.ToDouble(); y1=Edit22->Text.ToDouble(); tol=Edit25->Text.ToDouble(); while(aux!=1){ x2=F0-(A1*y1); y2=F1-(B0*x1); dx=x2-x1; dy=y2-y1; Dx=fabs(dx); Dy=fabs(dy); if(Dx<tol&&Dy<tol) { Label4->Caption="¡Se encontró una aproximación!"; F01=(a0*x2)+(a1*y2); F11=(b0*x2)+(b1*y2); Edit26->Text=AnsiString(x2); Edit27->Text=AnsiString(y2); Edit30->Text=AnsiString(dx); Edit31->Text=AnsiString(dy); Edit34->Text=AnsiString(F01); Edit35->Text=AnsiString(F11); aux=1;} x1=x2; y1=y2; i++;}} Label5->Caption="Iteraciones: "+AnsiString(i); k=0; } //---------------------------------------------------------------//botón calcular paso a paso void __fastcall TForm1::Button3Click(TObject *Sender) { if(n==4){

47


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA if (k==0){ i=0; x1=Edit21->Text.ToDouble(); y1=Edit22->Text.ToDouble(); z1=Edit23->Text.ToDouble(); w1=Edit24->Text.ToDouble(); tol=Edit25->Text.ToDouble(); Label4->Caption="";} x2=F0-(A1*y1)-(A2*z1)-(A3*w1); y2=F1-(B0*x1)-(B2*z1)-(B3*w1); z2=F2-(C0*x1)-(C1*y1)-(C3*w1); w2=F3-(D0*x1)-(D1*y1)-(D2*z1); dx=x2-x1; dy=y2-y1; dz=z2-z1; dw=w2-w1; Dx=fabs(dx); Dy=fabs(dy); Dz=fabs(dz); Dw=fabs(dw); if(Dx<tol&&Dy<tol&&Dz<tol&&Dw<tol) { Label4->Caption="¡Se encontró una aproximación!";} F01=(a0*x2)+(a1*y2)+(a2*z2)+(a3*w2); F11=(b0*x2)+(b1*y2)+(b2*z2)+(b3*w2); F21=(c0*x2)+(c1*y2)+(c2*z2)+(c3*w2); F31=(d0*x2)+(d1*y2)+(d2*z2)+(d3*w2); Edit26->Text=AnsiString(x2); Edit27->Text=AnsiString(y2); Edit28->Text=AnsiString(z2); Edit29->Text=AnsiString(w2); Edit30->Text=AnsiString(dx); Edit31->Text=AnsiString(dy); Edit32->Text=AnsiString(dz); Edit33->Text=AnsiString(dw); Edit34->Text=AnsiString(F01); Edit35->Text=AnsiString(F11); Edit36->Text=AnsiString(F21); Edit37->Text=AnsiString(F31); x1=x2; y1=y2; z1=z2; w1=w2;}

48


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA else if(n==3){ if (k==0){ i=0; x1=Edit21->Text.ToDouble(); y1=Edit22->Text.ToDouble(); z1=Edit23->Text.ToDouble(); tol=Edit25->Text.ToDouble(); Label4->Caption="";} x2=F0-(A1*y1)-(A2*z1); y2=F1-(B0*x1)-(B2*z1); z2=F2-(C0*x1)-(C1*y1); dx=x2-x1; dy=y2-y1; dz=z2-z1; Dx=fabs(dx); Dy=fabs(dy); Dz=fabs(dz); if(Dx<tol&&Dy<tol&&Dz<tol) { Label4->Caption="¡Se encontró una aproximación!";} F01=(a0*x2)+(a1*y2)+(a2*z2); F11=(b0*x2)+(b1*y2)+(b2*z2); F21=(c0*x2)+(c1*y2)+(c2*z2); Edit26->Text=AnsiString(x2); Edit27->Text=AnsiString(y2); Edit28->Text=AnsiString(z2); Edit30->Text=AnsiString(dx); Edit31->Text=AnsiString(dy); Edit32->Text=AnsiString(dz); Edit34->Text=AnsiString(F01); Edit35->Text=AnsiString(F11); Edit36->Text=AnsiString(F21); x1=x2; y1=y2; z1=z2;} else { if (k==0){ i=0; x1=Edit21->Text.ToDouble(); y1=Edit22->Text.ToDouble(); tol=Edit25->Text.ToDouble(); Label4->Caption="";}

49


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA x2=F0-(A1*y1); y2=F1-(B0*x1); dx=x2-x1; dy=y2-y1; Dx=fabs(dx); Dy=fabs(dy); if(Dx<tol&&Dy<tol) { Label4->Caption="¡Se encontró una aproximación!";} F01=(a0*x2)+(a1*y2); F11=(b0*x2)+(b1*y2); Edit26->Text=AnsiString(x2); Edit27->Text=AnsiString(y2); Edit30->Text=AnsiString(dx); Edit31->Text=AnsiString(dy); Edit34->Text=AnsiString(F01); Edit35->Text=AnsiString(F11); x1=x2; y1=y2;} i++; Label5->Caption="Iteraciones: "+AnsiString(i); k++; } //---------------------------------------------------------------//botón reset void __fastcall TForm1::Button4Click(TObject *Sender) { Edit1->Text=""; Edit1->SetFocus(); Edit2->Text=""; Edit3->Text=""; Edit4->Text=""; Edit5->Text=""; Edit6->Text=""; Edit7->Text=""; Edit8->Text=""; Edit9->Text=""; Edit10->Text=""; Edit11->Text=""; Edit12->Text=""; Edit13->Text="";

50


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA Edit14->Text=""; Edit15->Text=""; Edit16->Text=""; Edit17->Text=""; Edit18->Text=""; Edit19->Text=""; Edit20->Text=""; Edit21->Text=""; Edit22->Text=""; Edit23->Text=""; Edit24->Text=""; Edit25->Text=""; Edit26->Text=""; Edit27->Text=""; Edit28->Text=""; Edit29->Text=""; Edit30->Text=""; Edit31->Text=""; Edit32->Text=""; Edit33->Text=""; Edit34->Text=""; Edit35->Text=""; Edit36->Text=""; Edit37->Text=""; Label3->Caption="Observaciones..."; Label4->Caption=""; Label5->Caption=""; Button2->Enabled=true; Button3->Enabled=true; } //----------------------------------------------------------------

51


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

5.- Método de Gauss Siedel

Este método es similar al método anterior, el de Jacobi, también para sistemas de ecuaciones lineales, a diferencia de Jacobi, ahora Gauss retoma los valores ya calculados, y los usa para calcular los nuevos valores de las demás variables:

Recordemos la ecuación del método de Jacobi, ahora usando los nuevos valores ya calculados. De esta forma es más rápido el proceso. De esta forma al igual que el método de Jacobi, para un número n+1 de variables, necesitará un número n de valores iniciales. Las interacciones son de la misma manera que el método anterior, de igual forma el criterio de paro y el criterio para la convergencia del método serán las mismas que para el método de Jacobi, por lo que no se vuelven a enunciar en esta sección, queda al lector regresar al tema anterior para revisar las formulas y los criterios de convergencia.

52


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

Programación: Interfaz gráfica propuesta

Interpretación por botón Botón “2x2”: El formulario muestra por defecto un arreglo matricial de 4x4, al presionar el botón oculta y reordena los Edits del formulario, de tal forma que se muestre sólo un arreglo de 2x2; oculta también todos los Edits relacionados con las variables que no forman parte del sistema de ecuaciones. Botón “3x3”: Oculta y reordena los Edits del formulario, de tal forma que se muestre sólo un arreglo matricial de 3x3; oculta también todos los Edits relacionados con las variables que no forman parte del sistema de ecuaciones.

53


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

Botón “4x4”: Muestra y reordena todos los Edits del formulario, en la forma en que se encontraban originalmente. Botón “ Capturar/convergencia”: Para un arreglo de 4x4: Lee los datos de la matriz formada por el sistema de ecuaciones: . Para un arreglo de 3x3: Lee los datos de la matriz formada por el sistema de ecuaciones: . Para un arreglo de 2x2: Lee los datos de la matriz formada por el sistema de ecuaciones: . Comprueba que los elementos de la diagonal sean iguales a cero, si alguno cumple esa condición imprime una advertencia diciendo que los elementos de la diagonal principal deben ser distintos de cero y desactiva los botones “Calcular aproximación” y “Calcular paso a pas0”. De lo contrario comprueba que la matriz sea dominante, comparando los elementos de la diagonal con los demás:  Si el valor absoluto de cada elemento de la diagonal es mayor a la suma de los valores absolutos de los demás elementos de la fila donde se encuentra, imprime un mensaje diciendo que la matriz es fuertemente dominante.  Si el valor absoluto de uno o más elementos de la diagonal es igual a la suma de los valores absolutos de los demás elementos de la fila donde se encuentra, sin que ninguno sea menor que dicha suma, imprime un mensaje diciendo que la matriz es débilmente dominante.  Si no cumple ninguna condición quiere decir que no es una matriz dominante por lo que es posible que el método no sea convergente para la matriz en cuestión, por lo que imprime un mensaje que advierte que no se garantiza la convergencia del método, y desactiva el botón “Calcular aproximación”. Por último normaliza los coeficientes de las ecuaciones anteriormente mostradas, con los datos necesarios, dependiendo del orden de la matriz. Botón “Calcular aproximación”: Lee el valor de la tolerancia deseada y los valores iniciales de las variables a calcular, dependiendo del orden de la matriz.  Para matrices de orden 4x4: .

54


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

 Para matrices de orden 3x3:  Para matrices de orden 2x2:

. .

Dentro de una estructura de repetición „while’: Calcula nuevos valores para cada una con las ecuaciones anteriormente descritas y calcula el error para cada una de ellas, restando el valor inicial al recién calculado. Compara los valores absolutos de los errores con la tolerancia establecida y si todos son menores a ésta, imprime un mensaje señalando que se ha encontrado una aproximación, sustituye los nuevos valores en las ecuaciones originales para comprobar los resultados y los imprime, al igual que los valores recién calculados y el error de cada uno en los Edits correspondientes. También muestra un mensaje con el número de iteraciones realizadas y detiene el proceso. De no cumplir la condición: Reasigna valores a las variables, siendo ahora el valor inicial igual al recién calculado ( ) y aumenta en uno el contador de iteraciones. Reinicia el proceso. Botón “Calcular paso a paso”: La primera vez que se pulsa: Lee el valor de la tolerancia deseada y los valores iniciales de las variables a calcular, dependiendo del orden de la matriz.  Para matrices de orden 4x4: .  Para matrices de orden 3x3: .  Para matrices de orden 2x2: . En las siguientes iteraciones toma como valor inicial el valor recién calculado en las operaciones efectuadas. Calcula nuevos valores para cada una con las ecuaciones anteriormente descritas y calcula el error para cada una de ellas, restando el valor inicial al recién calculado. Compara los valores absolutos de los errores con la tolerancia establecida y si todos son menores a ésta, imprime un mensaje señalando que se ha encontrado una aproximación. Sustituye los nuevos valores en las ecuaciones originales para comprobar los resultados. Reasigna valores a las variables, siendo ahora el valor inicial igual al recién calculado ( ). Imprime los valores recién calculados, sus respectivos errores y el valor de la ecuación en función de los nuevos valores en los Edits correspondientes. También imprime un mensaje con el número de iteraciones, y aumenta en uno el contador.

55


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA //---------------------------------------------------------------#include <vcl.h> #pragma hdrstop #include "Unit1.h" //---------------------------------------------------------------#pragma package(smart_init) #pragma resource "*.dfm" #include <math.h> double n=4,m,k,a0,a1,a2,a3,b0,b1,b2,b3,c0,c1,c2,c3,d0,d1,d2,d3,f0, f1,f2,f3,s1,s2,s3,s4,q1,q2,q3,q4,F0,F1,F2,F3,A1,A2,A3,B0,B2,B3,C0, C1,C3,D0,D1,D2,x1=0,x2,y1,y2,z1,z2,w1,w2,tol,F01,F11,F21,F31,dx, dy,dz,dw,Dx,Dy,Dz,Dw,i,aux; TForm1 *Form1; //---------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //---------------------------------------------------------------//botón 2x2 void __fastcall TForm1::Button5Click(TObject *Sender) { Image1->Visible=false; Image38->Visible=false; Image39->Visible=true; Image2->Left=352; Image3->Left=448; Image7->Left=352; Image8->Left=448; Image4->Visible=false; Image5->Visible=false; Image9->Visible=false; Image10->Visible=false; Image12->Visible=false; Image13->Visible=false; Image14->Visible=false; Image15->Visible=false; Image16->Visible=false; Image17->Visible=false; Image18->Visible=false; Image19->Visible=false; Image20->Visible=false;

56


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA Image21->Visible=false; Image24->Visible=false; Image25->Visible=false; Image28->Visible=false; Image29->Visible=false; Image32->Visible=false; Image33->Visible=false; Image36->Visible=false; Image37->Visible=false; Edit1->Left=328; Edit2->Left=424; Edit6->Left=328; Edit7->Left=424; Edit3->Visible=false; Edit4->Visible=false; Edit8->Visible=false; Edit9->Visible=false; Edit11->Visible=false; Edit12->Visible=false; Edit13->Visible=false; Edit14->Visible=false; Edit15->Visible=false; Edit16->Visible=false; Edit17->Visible=false; Edit18->Visible=false; Edit19->Visible=false; Edit20->Visible=false; Edit23->Visible=false; Edit24->Visible=false; Edit28->Visible=false; Edit29->Visible=false; Edit32->Visible=false; Edit33->Visible=false; Edit36->Visible=false; Edit37->Visible=false; Edit1->SetFocus(); n=2; } //---------------------------------------------------------------//botón 3x3 void __fastcall TForm1::Button6Click(TObject *Sender) { Image1->Visible=false; Image38->Visible=true; Image39->Visible=false;

57


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA Image2->Left=256; Image3->Left=352; Image4->Left=448; Image7->Left=256; Image8->Left=352; Image9->Left=448; Image12->Left=256; Image13->Left=352; Image14->Left=448; Image4->Visible=true; Image5->Visible=false; Image9->Visible=true; Image10->Visible=false; Image12->Visible=true; Image13->Visible=true; Image14->Visible=true; Image15->Visible=false; Image16->Visible=true; Image17->Visible=false; Image18->Visible=false; Image19->Visible=false; Image20->Visible=false; Image21->Visible=false; Image24->Visible=true; Image25->Visible=false; Image28->Visible=true; Image29->Visible=false; Image32->Visible=true; Image33->Visible=false; Image36->Visible=true; Image37->Visible=false; Edit1->Left=232; Edit2->Left=328; Edit3->Left=424; Edit6->Left=232; Edit7->Left=328; Edit8->Left=424; Edit11->Left=232; Edit12->Left=328; Edit13->Left=424; Edit3->Visible=true; Edit4->Visible=false; Edit8->Visible=true; Edit9->Visible=false; Edit11->Visible=true; Edit12->Visible=true; Edit13->Visible=true; Edit14->Visible=false;

58


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA Edit15->Visible=true; Edit16->Visible=false; Edit17->Visible=false; Edit18->Visible=false; Edit19->Visible=false; Edit20->Visible=false; Edit23->Visible=true; Edit24->Visible=false; Edit28->Visible=true; Edit29->Visible=false; Edit32->Visible=true; Edit33->Visible=false; Edit36->Visible=true; Edit37->Visible=false; Edit1->SetFocus(); n=3; } //---------------------------------------------------------------//botón 4x4 void __fastcall TForm1::Button7Click(TObject *Sender) { Image1->Visible=true; Image38->Visible=false; Image39->Visible=false; Image2->Left=160; Image3->Left=256; Image4->Left=352; Image5->Left=448; Image7->Left=160; Image8->Left=256; Image9->Left=352; Image10->Left=448; Image12->Left=160; Image13->Left=256; Image14->Left=352; Image15->Left=448; Image4->Visible=true; Image5->Visible=true; Image9->Visible=true; Image10->Visible=true; Image12->Visible=true; Image13->Visible=true; Image14->Visible=true; Image15->Visible=true; Image16->Visible=true;

59


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA Image17->Visible=true; Image18->Visible=true; Image19->Visible=true; Image20->Visible=true; Image21->Visible=true; Image24->Visible=true; Image25->Visible=true; Image28->Visible=true; Image29->Visible=true; Image32->Visible=true; Image33->Visible=true; Image36->Visible=true; Image37->Visible=true; Edit1->Left=136; Edit2->Left=232; Edit3->Left=328; Edit4->Left=424; Edit6->Left=136; Edit7->Left=232; Edit8->Left=328; Edit9->Left=424; Edit11->Left=136; Edit12->Left=232; Edit13->Left=328; Edit14->Left=424; Edit3->Visible=true; Edit4->Visible=true; Edit8->Visible=true; Edit9->Visible=true; Edit11->Visible=true; Edit12->Visible=true; Edit13->Visible=true; Edit14->Visible=true; Edit15->Visible=true; Edit16->Visible=true; Edit17->Visible=true; Edit18->Visible=true; Edit19->Visible=true; Edit20->Visible=true; Edit23->Visible=true; Edit24->Visible=true; Edit28->Visible=true; Edit29->Visible=true; Edit32->Visible=true; Edit33->Visible=true; Edit36->Visible=true; Edit37->Visible=true; Edit1->SetFocus();

60


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA n=4;} //---------------------------------------------------------------//botón capturar/convergencia void __fastcall TForm1::Button1Click(TObject *Sender) { if(n==4){ a0=Edit1->Text.ToDouble(); a1=Edit2->Text.ToDouble(); a2=Edit3->Text.ToDouble(); a3=Edit4->Text.ToDouble(); f0=Edit5->Text.ToDouble(); b0=Edit6->Text.ToDouble(); b1=Edit7->Text.ToDouble(); b2=Edit8->Text.ToDouble(); b3=Edit9->Text.ToDouble(); f1=Edit10->Text.ToDouble(); c0=Edit11->Text.ToDouble(); c1=Edit12->Text.ToDouble(); c2=Edit13->Text.ToDouble(); c3=Edit14->Text.ToDouble(); f2=Edit15->Text.ToDouble(); d0=Edit16->Text.ToDouble(); d1=Edit17->Text.ToDouble(); d2=Edit18->Text.ToDouble(); d3=Edit19->Text.ToDouble(); f3=Edit20->Text.ToDouble(); if(a0==0||b1==0||c2==0||d3==0){ Label3->Caption="Los elementos de la diagonal principal deben ser distintos de cero."; Button2->Enabled=false; Button3->Enabled=false; } else{ s1= s2= s3= s4=

fabs(a1)+fabs(a2)+fabs(a3); fabs(b0)+fabs(b2)+fabs(b3); fabs(c0)+fabs(c1)+fabs(c3); fabs(d0)+fabs(d1)+fabs(d2);

q1=s1/fabs(a0); q2=s2/fabs(b1); q3=s3/fabs(c2); q4=s4/fabs(d3);

61


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA m=q1+q2+q3+q4; if(q1<1&&q2<1&&q3<1&&q4<1){ Label3->Caption="La matriz es fuertemente dominante."; Button2->Enabled=true; Button3->Enabled=true;} else if(q1<=1&&q2<=1&&q3<=1&&q4<=1&&m<4){ Label3->Caption="La matriz es débilmente dominante."; Button2->Enabled=true; Button3->Enabled=true;} else{ Label3->Caption="El método no garantiza convergencia."; Button2->Enabled=false; Button3->Enabled=true;} A1=a1/a0; A2=a2/a0; A3=a3/a0; F0=f0/a0; B0=b0/b1; B2=b2/b1; B3=b3/b1; F1=f1/b1; C0=c0/c2; C1=c1/c2; C3=c3/c2; F2=f2/c2; D0=d0/d3; D1=d1/d3; D2=d2/d3; F3=f3/d3;}} else if(n==3){ a0=Edit1->Text.ToDouble(); a1=Edit2->Text.ToDouble(); a2=Edit3->Text.ToDouble(); f0=Edit5->Text.ToDouble(); b0=Edit6->Text.ToDouble(); b1=Edit7->Text.ToDouble(); b2=Edit8->Text.ToDouble(); f1=Edit10->Text.ToDouble(); c0=Edit11->Text.ToDouble();

62


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA c1=Edit12->Text.ToDouble(); c2=Edit13->Text.ToDouble(); f2=Edit15->Text.ToDouble(); if(a0==0||b1==0||c2==0){ Label3->Caption="Los elementos de la diagonal principal deben ser distintos de cero."; Button2->Enabled=false; Button3->Enabled=false;} else{ s1= fabs(a1)+fabs(a2); s2= fabs(b0)+fabs(b2); s3= fabs(c0)+fabs(c1); q1=s1/fabs(a0); q2=s2/fabs(b1); q3=s3/fabs(c2); m=q1+q2+q3; if(q1<1&&q2<1&&q3<1) { Label3->Caption="La matriz es fuertemente dominante."; Button2->Enabled=true; Button3->Enabled=true;} else if(q1<=1&&q2<=1&&q3<=1&&m<3){ Label3->Caption="La matriz es débilmente dominante."; Button2->Enabled=true; Button3->Enabled=true;} else{ Label3->Caption="El método no garantiza convergencia."; Button2->Enabled=false; Button3->Enabled=true;} A1=a1/a0; A2=a2/a0; F0=f0/a0; B0=b0/b1; B2=b2/b1; F1=f1/b1; C0=c0/c2; C1=c1/c2; F2=f2/c2;}} else { a0=Edit1->Text.ToDouble();

63


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA a1=Edit2->Text.ToDouble(); f0=Edit5->Text.ToDouble(); b0=Edit6->Text.ToDouble(); b1=Edit7->Text.ToDouble(); f1=Edit10->Text.ToDouble(); if(a0==0||b1==0){ Label3->Caption="Los elementos de la diagonal principal deben ser distintos de cero."; Button2->Enabled=false; Button3->Enabled=false;} else{ s1= fabs(a1); s2= fabs(b0); q1=s1/fabs(a0); q2=s2/fabs(b1); m=q1+q2; if(q1<1&&q2<1){ Label3->Caption="La matriz es fuertemente dominante."; Button2->Enabled=true; Button3->Enabled=true;} else if(q1<=1&&q2<=1&&m<2){ Label3->Caption="La matriz es débilmente dominante."; Button2->Enabled=true; Button3->Enabled=true;} else{ Label3->Caption="El método no garantiza convergencia."; Button2->Enabled=false; Button3->Enabled=true;} A1=a1/a0; F0=f0/a0; B0=b0/b1; F1=f1/b1;}} i=0; k=0; } //----------------------------------------------------------------

64


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA //botón calcular aproximación void __fastcall TForm1::Button2Click(TObject *Sender) { i=0; aux=0; if(n==4){ y1=Edit22->Text.ToDouble(); z1=Edit23->Text.ToDouble(); w1=Edit24->Text.ToDouble(); tol=Edit25->Text.ToDouble(); while(aux!=1){ x2=F0-(A1*y1)-(A2*z1)-(A3*w1); y2=F1-(B0*x2)-(B2*z1)-(B3*w1); z2=F2-(C0*x2)-(C1*y2)-(C3*w1); w2=F3-(D0*x2)-(D1*y2)-(D2*z2); dx=x2-x1; dy=y2-y1; dz=z2-z1; dw=w2-w1; Dx=fabs(dx); Dy=fabs(dy); Dz=fabs(dz); Dw=fabs(dw); if(Dx<tol&&Dy<tol&&Dz<tol&&Dw<tol) { Label4->Caption="¡Se encontró una aproximación!"; F01=(a0*x2)+(a1*y2)+(a2*z2)+(a3*w2); F11=(b0*x2)+(b1*y2)+(b2*z2)+(b3*w2); F21=(c0*x2)+(c1*y2)+(c2*z2)+(c3*w2); F31=(d0*x2)+(d1*y2)+(d2*z2)+(d3*w2); Edit26->Text=AnsiString(x2); Edit27->Text=AnsiString(y2); Edit28->Text=AnsiString(z2); Edit29->Text=AnsiString(w2); Edit30->Text=AnsiString(dx); Edit31->Text=AnsiString(dy); Edit32->Text=AnsiString(dz); Edit33->Text=AnsiString(dw); Edit34->Text=AnsiString(F01); Edit35->Text=AnsiString(F11); Edit36->Text=AnsiString(F21); Edit37->Text=AnsiString(F31); aux=1;}

65


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA x1=x2; y1=y2; z1=z2; w1=w2; i++;}} else if(n==3){ y1=Edit22->Text.ToDouble(); z1=Edit23->Text.ToDouble(); tol=Edit25->Text.ToDouble(); while(aux!=1){ x2=F0-(A1*y1)-(A2*z1); y2=F1-(B0*x2)-(B2*z1); z2=F2-(C0*x2)-(C1*y2); dx=x2-x1; dy=y2-y1; dz=z2-z1; Dx=fabs(dx); Dy=fabs(dy); Dz=fabs(dz); if(Dx<tol&&Dy<tol&&Dz<tol) { Label4->Caption="¡Se encontró una aproximación!"; F01=(a0*x2)+(a1*y2)+(a2*z2); F11=(b0*x2)+(b1*y2)+(b2*z2); F21=(c0*x2)+(c1*y2)+(c2*z2); Edit26->Text=AnsiString(x2); Edit27->Text=AnsiString(y2); Edit28->Text=AnsiString(z2); Edit30->Text=AnsiString(dx); Edit31->Text=AnsiString(dy); Edit32->Text=AnsiString(dz); Edit34->Text=AnsiString(F01); Edit35->Text=AnsiString(F11); Edit36->Text=AnsiString(F21); aux=1;} x1=x2; y1=y2; z1=z2; i++;}}

66


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA else { y1=Edit22->Text.ToDouble(); tol=Edit25->Text.ToDouble(); while(aux!=1){ x2=F0-(A1*y1); y2=F1-(B0*x2); dx=x2-x1; dy=y2-y1; Dx=fabs(dx); Dy=fabs(dy); if(Dx<tol&&Dy<tol) { Label4->Caption="¡Se encontró una aproximación!"; F01=(a0*x2)+(a1*y2); F11=(b0*x2)+(b1*y2); Edit26->Text=AnsiString(x2); Edit27->Text=AnsiString(y2); Edit30->Text=AnsiString(dx); Edit31->Text=AnsiString(dy); Edit34->Text=AnsiString(F01); Edit35->Text=AnsiString(F11); aux=1;} x1=x2; y1=y2; i++;}} Label5->Caption="Iteraciones: "+AnsiString(i); k=0; } //---------------------------------------------------------------//botón calcular paso a paso void __fastcall TForm1::Button3Click(TObject *Sender) { if(n==4){ if (k==0){ i=0; y1=Edit22->Text.ToDouble();

67


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA z1=Edit23->Text.ToDouble(); w1=Edit24->Text.ToDouble(); tol=Edit25->Text.ToDouble(); Label4->Caption="";} x2=F0-(A1*y1)-(A2*z1)-(A3*w1); y2=F1-(B0*x2)-(B2*z1)-(B3*w1); z2=F2-(C0*x2)-(C1*y2)-(C3*w1); w2=F3-(D0*x2)-(D1*y2)-(D2*z2); dx=x2-x1; dy=y2-y1; dz=z2-z1; dw=w2-w1; Dx=fabs(dx); Dy=fabs(dy); Dz=fabs(dz); Dw=fabs(dw); if(Dx<tol&&Dy<tol&&Dz<tol&&Dw<tol) { Label4->Caption="¡Se encontró una aproximación!";} F01=(a0*x2)+(a1*y2)+(a2*z2)+(a3*w2); F11=(b0*x2)+(b1*y2)+(b2*z2)+(b3*w2); F21=(c0*x2)+(c1*y2)+(c2*z2)+(c3*w2); F31=(d0*x2)+(d1*y2)+(d2*z2)+(d3*w2); Edit26->Text=AnsiString(x2); Edit27->Text=AnsiString(y2); Edit28->Text=AnsiString(z2); Edit29->Text=AnsiString(w2); Edit30->Text=AnsiString(dx); Edit31->Text=AnsiString(dy); Edit32->Text=AnsiString(dz); Edit33->Text=AnsiString(dw); Edit34->Text=AnsiString(F01); Edit35->Text=AnsiString(F11); Edit36->Text=AnsiString(F21); Edit37->Text=AnsiString(F31); x1=x2; y1=y2; z1=z2; w1=w2;} else if(n==3){ if (k==0){ i=0; y1=Edit22->Text.ToDouble();

68


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA z1=Edit23->Text.ToDouble(); tol=Edit25->Text.ToDouble(); Label4->Caption="";} x2=F0-(A1*y1)-(A2*z1); y2=F1-(B0*x2)-(B2*z1); z2=F2-(C0*x2)-(C1*y2); dx=x2-x1; dy=y2-y1; dz=z2-z1; Dx=fabs(dx); Dy=fabs(dy); Dz=fabs(dz); if(Dx<tol&&Dy<tol&&Dz<tol) { Label4->Caption="¡Se encontró una aproximación!";} F01=(a0*x2)+(a1*y2)+(a2*z2); F11=(b0*x2)+(b1*y2)+(b2*z2); F21=(c0*x2)+(c1*y2)+(c2*z2); Edit26->Text=AnsiString(x2); Edit27->Text=AnsiString(y2); Edit28->Text=AnsiString(z2); Edit30->Text=AnsiString(dx); Edit31->Text=AnsiString(dy); Edit32->Text=AnsiString(dz); Edit34->Text=AnsiString(F01); Edit35->Text=AnsiString(F11); Edit36->Text=AnsiString(F21); x1=x2; y1=y2; z1=z2;} else { if (k==0){ i=0; y1=Edit22->Text.ToDouble(); tol=Edit25->Text.ToDouble(); Label4->Caption="";} x2=F0-(A1*y1); y2=F1-(B0*x2); dx=x2-x1; dy=y2-y1; Dx=fabs(dx);

69


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA Dy=fabs(dy); if(Dx<tol&&Dy<tol) { Label4->Caption="¡Se encontró una aproximación!";} F01=(a0*x2)+(a1*y2); F11=(b0*x2)+(b1*y2); Edit26->Text=AnsiString(x2); Edit27->Text=AnsiString(y2); Edit30->Text=AnsiString(dx); Edit31->Text=AnsiString(dy); Edit34->Text=AnsiString(F01); Edit35->Text=AnsiString(F11); x1=x2; y1=y2;} i++; Label5->Caption="Iteraciones: "+AnsiString(i); k++; } //---------------------------------------------------------------//botón reset void __fastcall TForm1::Button4Click(TObject *Sender) { Edit1->Text=""; Edit1->SetFocus(); Edit2->Text=""; Edit3->Text=""; Edit4->Text=""; Edit5->Text=""; Edit6->Text=""; Edit7->Text=""; Edit8->Text=""; Edit9->Text=""; Edit10->Text=""; Edit11->Text=""; Edit12->Text=""; Edit13->Text=""; Edit14->Text=""; Edit15->Text=""; Edit16->Text=""; Edit17->Text=""; Edit18->Text=""; Edit19->Text=""; Edit20->Text="";

70


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA Edit22->Text=""; Edit23->Text=""; Edit24->Text=""; Edit25->Text=""; Edit26->Text=""; Edit27->Text=""; Edit28->Text=""; Edit29->Text=""; Edit30->Text=""; Edit31->Text=""; Edit32->Text=""; Edit33->Text=""; Edit34->Text=""; Edit35->Text=""; Edit36->Text=""; Edit37->Text=""; Label3->Caption="Observaciones..."; Label4->Caption=""; Label5->Caption=""; Button2->Enabled=true; Button3->Enabled=true; } //----------------------------------------------------------

71


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

6.- Método de Newton: Sistemas de ecuaciones no lineales

Este método nos servirá para encontrar la solución a un sistema no lineal es decir de exponentes diferentes a 1. Para su análisis se propondrá el siguiente sistema: + Corresponden a la ecuación de una circunferencia y de una hipérbola respectivamente

La figura anterior muestra gráficamente al sistema de ecuaciones, donde se encuentran una circunferencia y una hipérbola. La fórmula de recurrencia de este método es la siguiente: ( (

[

) ] )

( )

Donde J es el Jacobiano:

[

Y

]

lo podemos determinar de la siguiente manera: | |

[

( )]

72


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

La ecuación (1) tiene analogía con la ecuación (2) del método de Newton Raphson para encontrar raíces de ecuaciones: (

)

(

)

( )

Para encontrar la fórmula de recurrencia del sistema propuesto se procede a lo siguiente: (

)

( (

)

(

)

)

+

Se saca el Jacobiano: [

]

| | ( )

[

]

Se deja al lector sacar la adjunta a la matriz, una manera es por cofactores o por la fórmula de la adjunta, si es una matriz de orden mayor se realizan por métodos ya conocidos. Posteriormente se precede a conocer a

:

[

( )]

*

+

*

+ [

Podemos verificar la inversa haciendo

:

[ [

]

]

*

+

]

Sabiendo que:

*

+ y

*

+

73


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

Ahora sustituimos los valores ya calculados en la fórmula (1):

*

+

*

+

[ [

+

]

]

Al realizar las operaciones requeridas obtenemos las fórmulas de recurrencia, las cuales son: (

+

)

(

)

( )

(

+

)+

(

)

( )

Reduciendo términos semejantes tenemos:

+

( )

+

( )

Finalmente las ecuaciones 5 y 6 son nuestras fórmulas de recurrencia, las cuales deben ser diferentes de cero: y Haciendo

, tenemos las siguientes ecuaciones:

+ + Recordando que estas ecuaciones son para el sistema analizado, únicamente para ello, para saber las fórmulas para otros sistemas se tiene que realizar el mismo procedimiento, aplicando la formula (1), hasta obtener las fórmulas de recurrencia requeridas para la solución del sistema no lineal.

74


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

Programación: Interfaz gráfica propuesta

Interpretación por botón

Botón “Aproximar solución”: Lee los valores para y , la tolerancia y el número de iteraciones deseadas, las cuales deberán cumplir ciertas condiciones: 

y deben ser distintos de cero para no indeterminar el resultado, puesto que ambas variables se encuentran en el denominador de las ecuaciones de recurrencia.

 La tolerancia y el número de iteraciones establecidos deben ser mayores que cero. Si alguna de estas condiciones no se cumple, muestra una advertencia y borra dicho valor y posiciona el cursor sobre él para corregirlo. Si todas las condiciones se cumplen continúa el proceso calculando, dentro de una estructura de repetición „while’, y con ayuda de las ecuaciones (5) y (6)

75


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

anteriormente mostradas; calcula el error de cada variable, restando el valor inicial al valor recién calculado. Compara los errores con la tolerancia y si ambos son menores que ésta detiene el proceso e imprime un mensaje informando que se ha encontrado un valor menor a la tolerancia, de lo contrario imprime un mensaje diciendo que no se encontró un valor menor a la tolerancia y reasigna valores a las variables, el valor recién calculado es ahora el valor inicial para la siguiente iteración y y aumenta en uno el contador de iteraciones. Si éste llega al límite de las iteraciones establecidas detiene el proceso. Sustituye los nuevos valores en las ecuaciones originales para comprobar los resultados. Imprime los valores de y , los resultados de las ecuaciones en función de los valores recién calculados y el número de iteraciones realizadas. Botón “Paso a paso”: La primera vez que se presiona el botón lee los valores para y y la tolerancia, si los valores no cumplen con las condiciones anteriormente mencionadas, muestra un mensaje señalando que datos es necesario corregir, los borra y posiciona el cursor sobre ellos. De cumplirse todas las condiciones realizan los cálculos de y con ayuda de las ecuaciones (5) y (6), y calcula el error de cada variable, restando el valor inicial al valor recién calculado. Compara los errores con la tolerancia y si ambos son menores que ésta detiene el proceso e imprime un mensaje informando que se ha encontrado un valor menor a la tolerancia, de lo contrario imprime un mensaje diciendo que no se encontró un valor menor a la tolerancia y reasigna valores a las variables, y y aumenta en uno el contador de iteraciones. Sustituye los nuevos valores en las ecuaciones originales para comprobar los resultados. Imprime los valores de y , los resultados de las ecuaciones en función de los valores recién calculados y el número de iteraciones realizadas. Botón “Limpiar valores”: Borra los datos escritos en el formulario y posiciona el puntero en el primer Edit. Reinicia el valor de la variable auxiliar.

76


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

Código de programación //---------------------------------------------------------------#include <vcl.h> #pragma hdrstop #include "Unit1.h" //---------------------------------------------------------------#pragma package(smart_init) #pragma resource "*.dfm" #include "math.h" double x1, y1, x2, y2, Tol, n, aux=0, c1, c2, dx, dy,i; TForm1 *Form1; //---------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //---------------------------------------------------------------//botón aproximar solución void __fastcall TForm1::Button1Click(TObject *Sender) { x1=Edit1->Text.ToDouble(); y1=Edit2->Text.ToDouble(); Tol=Edit3->Text.ToDouble(); n=Edit4->Text.ToDouble(); aux=0; i=0; if (x1==0||y1==0||Tol<=0||n<=0) { if (x1==0&&y1==0&&Tol<=0&&n<=0){ ShowMessage("x1 y y1 deben ser distintos de cero, la tolerancia y n mayores que cero."); Edit1->Text=""; Edit2->Text=""; Edit3->Text=""; Edit4->Text=""; Edit1->SetFocus();} else if (x1==0&&y1==0&&Tol<=0){ ShowMessage("x1 y y1 deben ser distintos de cero y la tolerancia mayor que cero."); Edit1->Text=""; Edit2->Text="";

77


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA Edit3->Text=""; Edit1->SetFocus();} else if (x1==0&&y1==0&&n<=0) {ShowMessage("x1 y y1 deben distintos de cero y n mayor que cero."); Edit1->Text=""; Edit2->Text=""; Edit4->Text=""; Edit1->SetFocus();} else if (y1==0&& Tol<=0&& n<=0) {ShowMessage("x1 debe ser distinto de cero, la tolerancia y n mayores que cero."); Edit2->Text=""; Edit3->Text=""; Edit4->Text=""; Edit2->SetFocus();} else if (x1==0&& Tol<=0&&n<=0) {ShowMessage("x1 debe ser distinto de cero, la tolerancia mayor que cero y n mayor que 2."); Edit1->Text=""; Edit3->Text=""; Edit4->Text=""; Edit1->SetFocus();} else if (x1==0&& y1==0) {ShowMessage("x1 y y1 deben ser distintos de cero."); Edit1->Text=""; Edit2->Text=""; Edit1->SetFocus();} else if (x1==0&& Tol<=0) {ShowMessage("x1 debe ser distinto de cero y la tolerancia mayor que cero"); Edit1->Text=""; Edit3->Text=""; Edit1->SetFocus();} else if (x1==0&&n<=0) {ShowMessage("x1 debe ser distinto de cero y n mayor que cero."); Edit1->Text=""; Edit4->Text=""; Edit1->SetFocus();} else if (y1==0&& Tol<=0) {ShowMessage("y1 debe ser distinto de cero y la tolerancia mayor que cero."); Edit2->Text=""; Edit3->Text="";

78


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA Edit2->SetFocus();} else if (y1==0&&n<=0) {ShowMessage("y1 debe ser distinto de cero y n mayor que cero."); Edit2->Text=""; Edit4->Text=""; Edit2->SetFocus();} else if (Tol<=0&&n<=0) {ShowMessage("La tolerancia debe ser mayor que cero y n mayor que cero."); Edit3->Text=""; Edit4->Text=""; Edit3->SetFocus();} else if (x1==0) {ShowMessage("x1 debe distinto de cero."); Edit1->Text=""; Edit1->SetFocus();} else if (y1==0) {ShowMessage("y1 debe distinto de cero."); Edit2->Text=""; Edit2->SetFocus();} else if (Tol<=0) {ShowMessage("La Tolerancia debe ser mayor que cero"); Edit3->Text=""; Edit3->SetFocus();} else { ShowMessage("n debe ser mayor que cero."); Edit4->Text=""; Edit4->SetFocus();} } else{ while(aux!=1&&i<n){ x2=(x1/2)+(11/(4*x1)); y2=(y1/2)+(9/(4*y1)); dx=fabs(x2-x1); dy=fabs(y2-y1); if (dx<Tol && dy<Tol){ Label8->Caption="Se encontró un valor menor a la tolerancia."; aux=1;}

79


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA else{ Label8->Caption="No se encontró un valor menor a la tolerancia. (Intente con un mayor número de iteraciones).";} x1=x2; y1=y2; i++; } c1=(x2*x2)+(y2*y2); c2=(x2*x2)-(y2*y2); Edit5->Text=AnsiString(x2); Edit6->Text=AnsiString(y2); Edit7->Text=AnsiString(c1); Edit8->Text=AnsiString(c2); Edit4->Text=AnsiString(i); } } //---------------------------------------------------------------//botón paso a paso void __fastcall TForm1::Button2Click(TObject *Sender) { if (aux<=1){ x1=Edit1->Text.ToDouble(); y1=Edit2->Text.ToDouble(); Tol=Edit3->Text.ToDouble(); i=0;} if (x1==0||y1==0||Tol<=0){ if (x1==0&&y1==0&&Tol<=0){ ShowMessage("x1 y y1 deben ser distintos de cero y la tolerancia mayor que cero."); Edit1->Text=""; Edit2->Text=""; Edit3->Text=""; Edit1->SetFocus();} else if (x1==0&& y1==0) {ShowMessage("x1 y y1 deben ser distintos de cero."); Edit1->Text=""; Edit2->Text=""; Edit1->SetFocus();} else if (x1==0&& Tol<=0)

80


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA {ShowMessage("x1 debe ser distinto de cero y la tolerancia mayor que cero"); Edit1->Text=""; Edit3->Text=""; Edit1->SetFocus();} else if (y1==0&& Tol<=0) {ShowMessage("y1 debe ser distinto de cero y la tolerancia mayor que cero."); Edit2->Text=""; Edit3->Text=""; Edit2->SetFocus();} else if (x1==0) {ShowMessage("x1 debe distinto de cero."); Edit1->Text=""; Edit1->SetFocus();} else if (y1==0) {ShowMessage("y1 debe distinto de cero."); Edit2->Text=""; Edit2->SetFocus();} else if (Tol<=0) {ShowMessage("La Tolerancia debe ser mayor que cero"); Edit3->Text=""; Edit3->SetFocus();} } else{ x2=(x1/2)+(11/(4*x1)); y2=(y1/2)+(9/(4*y1)); dx=fabs(x2-x1); dy=fabs(y2-y1); if (dx<Tol && dy<Tol){ Label8->Caption="Se encontró un valor menor a la tolerancia.";} else{ Label8->Caption="No se encontró un valor menor a la tolerancia. (Intente con un mayor número de iteraciones).";} x1=x2; y1=y2; c1=(x2*x2)+(y2*y2); c2=(x2*x2)-(y2*y2); aux=aux+2; i++; Edit5->Text=AnsiString(x2);

81


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA Edit6->Text=AnsiString(y2); Edit7->Text=AnsiString(c1); Edit8->Text=AnsiString(c2); Edit4->Text=AnsiString(i);} } //---------------------------------------------------------------//botón limpiar valores void __fastcall TForm1::Button3Click(TObject *Sender) { Edit1->Text=""; Edit2->Text=""; Edit3->Text=""; Edit4->Text=""; Edit5->Text=""; Edit6->Text=""; Edit7->Text=""; Edit8->Text=""; Edit1->SetFocus(); Label8->Caption=""; aux=0; } //----------------------------------------------------------------

82


UNIVERSIDAD AUTĂ“NOMA DE CHIAPAS FACULTAD DE INGENIERĂ?A

7.- InterpolaciĂłn: Newton y Lagrange Este mĂŠtodo sirve para encontrar un polinomio a partir de datos. i

0

1

2

3

El polinomio debe satisfacer que al sustituir debe ser exactamente igual a su correspondiente . Es decir, el polinomio ( ) que pasa exactamente por los cuatro puntos ( ), ( ), ( ), ( ) es la soluciĂłn del problema. Este mĂŠtodo nos ayudarĂĄ a encontrar un polinomio, con el cual podremos predecir valores que no se nos proporcionan. Interpolar significa “encontrar valores dentro del intervaloâ€? si quisiĂŠramos encontrar valores fuera del intervalo se llamarĂ­a extrapolaciĂłn. Lo que se quiere con este mĂŠtodo es predecir valores intermedios a partir del polinomio interpolador. đ?‘Ś Polinomio interpolador

Con el polinomio interpolador podremos predecir los valores intermedios en el intervalo sin la necesidad de mĂĄs datos.

đ?‘“(đ?‘Ľ)

đ?‘Ľ

đ?‘Ľ

đ?‘Ľ

đ?‘Ľ

đ?‘Ľ

83


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

( ) es un polinomio interpolador si se usa para predecir valores en el intervalo [ ].  ( ) es un polinomio extrapolador si se usa para predecir valores en la proximidad ][ del intervalo [ + ]. 

Interpolación de Newton “Diferencias divididas” La idea es obtener un polinomio de la forma: ( )

(

+

)+

(

)(

)+

+

(

)(

)

(

)

Dónde: [ ] [

]

[

]

[

]

[

]

[

]

Siendo [

] las diferencias divididas finitas.

El polinomio interpolador para el caso de tener 4 datos es: ( )

(

+

)+

(

)(

)+

(

)(

)(

)

Pasa exactamente por los cuatro puntos. El cálculo de los coeficientes es el siguiente:  Para ( ) +

, (

: )+

(

)(

)+

(

)(

)(

)

( )  Para ( ) +

, (

: )+

(

)(

( )

, obtenemos

(

(

+ +

Despejando

)+

(

)(

)(

)

) ) Notemos que es una pendiente

84


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

 Para ( ) +

,

: (

)+

(

)( (

+

)+ )+

(

(

)( )(

)(

)

)

De lo cual podemos hacer un despeje parcial para lograr la siguiente igualdad: (

(

)

(

)

)

Ahora en el numerador del miembro izquierdo de la igualdad, le sumamos un ( + ), de tal manera que no se altere la igualdad: (

(

+

)

(

cero

)

)

A continuación, aplicamos un poco de álgebra para así obtener los siguientes resultados: (

) (

(

)

( (

+ (

)

) +

(

)

+

(

)

)

)

Por lo tanto:

 Para ( ) + +

,

: (

(

)+ )+

(

)( (

)+ )(

( )+

)( (

)( )(

)(

) )

85


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

En donde se observa que cada coeficiente representa la diferencia de las dos diferencias divididas anteriores. Puede ser de mucha utilidad ordenar las diferencias divididas en una tabla, como se muestra a continuación: Tabla para generar los coeficientes:

Las diferencias se encuentran en el orden en el que se han colocado las flechas, retomando como numeradores a los valores ya obtenidos, teniendo cuidado con los denominadores, ya que estos no se toman de alado sino de la última diferencia o la más inferior de la cadena.

86


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

( )

+(

+

(

+( +(

+

(

)) )+

( (

+

)+

+ )

))

Esta tabla nos permite visualizar mejor el polinomio y simplifica la programación, la cual se ha de realizar posteriormente. Ejemplo:

i

0

1

2

3

Para realizar el cálculo, nos apoyamos de la tabla anterior, lo cual sería de la siguiente manera:

-2

4

-1

6

2

9

3

3

( (

(

)

(

)

)

(

(

) )

)

Se acomodó de la siguiente manera ya que las son iguales a las , y no afecta al resultado. Por lo que el polinomio interpolador queda de la siguiente manera: Por lo que el polinomio interpolador es: ( )

+ ( + ) ( )

( + )( + ) (

( )

) (

( +

)+(

( + )( + )( )+(

)

)

)

87


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

Interpolación de Lagrange

Este método pretende obtener un polinomio de la forma: ( )

( )+

( )+

( )+

( )

El cual debe satisfacer que: ( )

, ( )

, ( )

, ( )

Esto implica: ( )

( )

( )

( )

( )

( )

( )

( )

( )

( )

( )

( )

( )

( )

( )

( )

Los polinomios que cumplen son 4: ( ) ( ) ( ) ( )

( ( ( ( ( ( ( (

)( )(

)( )(

)

)( )(

)( )(

)

)( )(

)( )(

)

)( )(

)( )(

)

) ) ) )

Si sustituimos estos valores en la ecuación principal tendremos el siguiente polinomio: ( )

( (

)( )( ( + (

)( )( )( )(

) ( )( + ) ( )( )( ) ( + )( ) (

)( )( )( )(

) ) )( )(

) )

Desarrollando el polinomio y factorizando, obtenemos un polinomio de la forma: ( )

+

+

+

88


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

Dónde: (

(

)( +

)( (

) )(

+

(

)(

)(

)

)(

+

(

) )(

)(

)

)

Puesto que estos términos aparecen en los demás coeficientes del polinomio, conviene llamarlos:

(

(

(

(

)(

)(

)

(

)(

)(

)

(

)(

)(

)

(

)(

)(

)

)) + ( (

( (

(

+(

(

+

)+(

+(

(

(

)) + (

(

))

)) ))) + ( ( (

(

+

)) + (

+

)+(

)+(

))) + (

( (

(

)) + (

(

))) )+(

+

)) + (

))) (

))

Lo cual simplifica la programación, la cual se realizará posteriormente.

Ejemplo: i

Calculamos los valores para ( )

( (

)( )(

0 -2 1

1 1 3

2 2 5

( ), ( ), ( ) y )( )(

) )

(

3 -3 7

( ). )(

)(

)(

)

89


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

( (

( )

)( )(

( (

( )

)( )( ( (

( )

)( )(

) )

)( )(

)( )(

) )

)( )(

)(

(

)(

( ) )

)( )(

)(

(

)(

)

)(

)(

)

)(

)

Por lo tanto el polinomio interpolador para este conjunto de datos es igual a: ( )

(

(

)(

)(

)

(

)(

)(

(

( )

(

)+(

)+(

)+(

(

)( )

)

(

)( (

)(

)

) )(

)

)

+

)

Finalmente tenemos: ( )

+

Este es el polinomio que nos servirá para encontrar los valores intermedios en el intervalo dado, lo cual nos servirá como ya dijimos, para calcular valores desconocidos, siempre que se encuentren en el intervalo establecido.

90


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

Programación: Interfaz gráfica propuesta

Botón “Calcular coeficientes”: Lee los valores para , , , , , , y . Dependiendo del método seleccionado realiza las operaciones que son requeridas en cada caso. Para el método de Newton: calcula las diferencias divididas y utiliza las que corresponden para calcular los valores de , , y , según las fórmulas anteriormente mostradas. Realiza las operaciones para encontrar los coeficientes del polinomio interpolador. Imprime los datos en el formulario. Para el método de Lagrange: calcula los valores para , , y sin tomar en cuenta los términos en función de . Realiza las operaciones correspondientes para encontrar los coeficientes del polinomio interpolador. Imprime los datos en el formulario.

91


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

Botón “Graficar”: Lee los coeficientes del polinomio interpolador. Realiza la gráfica de dicho polinomio sobre un eje coordenado. Botón “Reset”: Borra los datos escritos y las gráficas trazadas en el formulario. Deshace la selección de los Radio Buttons y posiciona el puntero en el primer Edit.

92


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

Código de programación //---------------------------------------------------------------#include <vcl.h> #pragma hdrstop #include "Unit1.h" //---------------------------------------------------------------#pragma #pragma #pragma #pragma

package(smart_init) link "PERFGRAP" link "pies" resource "*.dfm"

double x0, x1, x2, x3, y0, y1, y2, y3, b0, b1, b2, b3, ab1, bb1, ab2, a, b, c, d, a0, a1, a2, a3, x, y, k, inicio; TForm1 *Form1; //---------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //---------------------------------------------------------------//botón calcular coeficientes void __fastcall TForm1::Button1Click(TObject *Sender) { y0=Edit1->Text.ToDouble(); y1=Edit2->Text.ToDouble(); y2=Edit3->Text.ToDouble(); y3=Edit4->Text.ToDouble(); x0=Edit5->Text.ToDouble(); x1=Edit6->Text.ToDouble(); x2=Edit7->Text.ToDouble(); x3=Edit8->Text.ToDouble(); //método de Newton if(RadioButton1->Checked==true) { b0=y0; b1=(y1-y0)/(x1-x0); ab1=(y2-y1)/(x2-x1); bb1=(y3-y2)/(x3-x2); b2=(ab1-b1)/(x2-x0);

93


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA ab2=(bb1-ab1)/(x3-x1); b3=(ab2-b2)/(x3-x0); Label2->Caption=FormatFloat("0.#####",b0); Label3->Caption=FormatFloat("0.#####",b1); Label4->Caption=FormatFloat("0.#####",b2); Label5->Caption=FormatFloat("0.#####",b3); //coeficientes del polinomio b=b2+(b3*(-x0-x1-x2)); c=b1+(b2*(-x0-x1))+(b3*((x0*(x1+x2))+(x1*x2))); d=b0-(b1*x0)+(b2*x0*x1)-(b3*x0*x1*x2); Edit9->Text=AnsiString(b3); Edit10->Text=AnsiString(b); Edit11->Text=AnsiString(c); Edit12->Text=AnsiString(d); Image3->Visible=true; Image4->Visible=true; Image5->Visible=true; Image6->Visible=true; Image11->Visible=false; Image12->Visible=false; Image13->Visible=false; Image14->Visible=false; } //método de Lagrange if(RadioButton2->Checked==true) { a0=y0/((x0-x1)*(x0-x2)*(x0-x3)); a1=y1/((x1-x0)*(x1-x2)*(x1-x3)); a2=y2/((x2-x0)*(x2-x1)*(x2-x3)); a3=y3/((x3-x0)*(x3-x1)*(x3-x2)); Label2->Caption=FormatFloat("0.#####",a0)+" (x ("+AnsiString(x1)+"))"+" (x -("+AnsiString(x2)+"))"+ " (x ("+AnsiString(x3)+"))"; Label3->Caption=FormatFloat("0.#####",a1)+" (x ("+AnsiString(x0)+"))"+" (x -("+AnsiString(x2)+"))"+ " (x ("+AnsiString(x3)+"))"; Label4->Caption=FormatFloat("0.#####",a2)+" (x ("+AnsiString(x0)+"))"+" (x -("+AnsiString(x1)+"))"+ " (x ("+AnsiString(x3)+"))";

94


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA Label5->Caption=FormatFloat("0.#####",a3)+" (x ("+AnsiString(x0)+"))"+" (x -("+AnsiString(x1)+"))"+ " (x ("+AnsiString(x2)+"))"; //coeficientes del polinomio a=a0+a1+a2+a3; b=(a0*(-x1-x2-x3))+(a1*(-x0-x2-x3))+(a2*(-x0-x1-x3))+(a3*(-x0-x1x2)); c=(a0*((x1*(x2+x3))+(x2*x3)))+(a1*((x0*(x2+x3))+(x2*x3)))+(a2*((x0 *(x1+x3))+(x1*x3)))+(a3*((x0*(x1+x2))+(x1*x2))); d=(-a0*(x1*x2*x3)) +(-a1*( x0*x2*x3))+(-a2*( x0*x1*x3))+(-a3*( x0*x1*x2)); Edit9->Text=AnsiString(a); Edit10->Text=AnsiString(b); Edit11->Text=AnsiString(c); Edit12->Text=AnsiString(d); Image3->Visible=false; Image4->Visible=false; Image5->Visible=false; Image6->Visible=false; Image11->Visible=true; Image12->Visible=true; Image13->Visible=true; Image14->Visible=true; } } //---------------------------------------------------------------//botón graficar void __fastcall TForm1::Button2Click(TObject *Sender) { //ejes Canvas->Pen->Color=clBlack; Canvas->Pen->Width=3; Canvas->PenPos=TPoint(656,128); Canvas->LineTo(656,504); Canvas->PenPos=TPoint(368,320); Canvas->LineTo(930,320); //puntas de los ejes Canvas->Pen->Width=2; Canvas->PenPos=TPoint(652,132);

95


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA Canvas->LineTo(656,128); Canvas->LineTo(660,132); Canvas->PenPos=TPoint(926,316); Canvas->LineTo(930,320); Canvas->LineTo(926,324); //gráfica de la función Canvas->Pen->Color=0x008A50D1; Canvas->Pen->Width=1; a=Edit9->Text.ToDouble(); b=Edit10->Text.ToDouble(); c=Edit11->Text.ToDouble(); d=Edit12->Text.ToDouble(); inicio=-400; x=inicio/15; y=15*((a*x*x*x)+(b*x*x)+(c*x)+d); Canvas->PenPos=TPoint(656+15*inicio,320-y); for(k=inicio;k<=300;k++) { x=k/15; y=15*((a*x*x*x)+(b*x*x)+(c*x)+d); Canvas->LineTo(656+15*x,320-y); } } //---------------------------------------------------------------//botón reset void __fastcall TForm1::Button3Click(TObject *Sender) { Form1->Visible=false; Form1->Visible=true; Image3->Visible=false; Image4->Visible=false; Image5->Visible=false; Image6->Visible=false; Image11->Visible=false; Image12->Visible=false; Image13->Visible=false; Image14->Visible=false; RadioButton1->Checked=false; RadioButton2->Checked=false;

96


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA Edit1->Text=""; Edit2->Text=""; Edit3->Text=""; Edit4->Text=""; Edit5->Text=""; Edit6->Text=""; Edit7->Text=""; Edit8->Text=""; Edit9->Text=""; Edit10->Text=""; Edit11->Text=""; Edit12->Text=""; Edit1->SetFocus(); Label2->Caption=""; Label3->Caption=""; Label4->Caption=""; Label5->Caption=""; } //----------------------------------------------------------------

97


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

8.- Derivación Numérica Tipos de derivación: La derivación clásica se opera sobre funciones Funciones

Funciones

𝑥

𝑥

𝑥

𝑥

𝑥

𝑥

La derivación cuando se conoce la función

𝑦

𝑥 + 𝑥

𝑦

Datos

𝑥+

Datos

1

13

2

19

3

25

Derivación numérica

Datos

Datos

98


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

En la derivación numérica partimos de datos y como resultado también obtenemos datos, para esto se tendrán que evaluar con la ayuda de sus vecinos, a la combinación que se haga se le llamará “ventana”, si tenemos de grado tendremos que usar a 3 números, es decir al número que se pretenda derivar y al de su derecha y al de su izquierda, si tenemos el grado se usarán 4 números como mínimo, en esta se pueden hacer combinaciones con los números de sus extremos del número a derivar, entre mayor sea el número de valores agregados mayor será la exactitud. Se basa en el principio del polinomio interpolador y del desarrollo de la serie de Taylor, como ya mencionamos entre mayor número de pares tengamos habrá mayor precisión. Se tendrá que derivar la serie de Taylor para obtener una fórmula para la derivación numérica, la cual tendrá la siguiente forma. Función de error

Serie de Taylor

Los pasos a seguir serán los siguientes: 1) Conjunto de pares de datos ( ). 2) Polinomio interpolador de orden “n”. 3) Derivar el polinomio interpolador. 4) Fórmula de orden “n” para el cálculo de la primera derivada. En otras palabras: A partir de un conjunto de datos se construye un polinomio interpolador … …

El salto es constante

Complementar el polinomio interpolador con una función de error para obtener por completo a la función que represente de manera exacta a los datos. Es decir, se desarrolla una serie de Taylor alrededor de los puntos analizados. ( )

( )+ ( )

Derivar a ( ) Sustituir

, …. ,

para obtener las distintas fórmulas para la derivación

99


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

Desarrollo de la serie de Taylor

( )

( ) ( )

(

+

( )

(

+

+ (

) ( )

)+

(

)

( )+ (

)

( )+ (

)(

)

)

( )

Evaluando en : ( )

+ ( ( )

+

)

( )

( ) “por la derecha”.

: ( )

+ (

)

( )

( )+ (

)

( )

( ) “por la izquierda”.

Fórmulas de orden dos ( Si

) para la primera derivada numérica.

, entonces tenemos tres pares de puntos

100


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

( )

( )+(

)(

)(

( )

)

Polinomio interpolador

( )

+ ( )

(

+

)+ +

+

(

)(

[(

)+(

[(

)+(

) )]

Evaluando en (Por la derecha): ( )

+

+

+

( )

)]

+

(Central): ( )

+

+ ( )

[(

)+(

)]

)+(

)]

+

+

(Por la izquierda): ( ) ( )

+

+

+ (

+

)

[( +

+

+

101


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

Derivando el factor de error: )(

[( [(

)(

)(

)+(

)

)(

( )

)+(

)(

)]

( )

Evaluando: ( ) ( ) ( )

( )

En esta existe menor error, ya que su denominador es mayor.

( ) ( )

Tabla para la primera derivada de orden

.

( )

+

( )

Derecha

( )

Izquierda

Orden 1

( )

+

( )

( )

+

Derecha

Orden 2 ( )

( )

( )

+

+

Central

( )

Izquierda

102


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

+

( )

( )

+

( )

( )

+

Derecha

Central

Orden 3 +

( )

+

( )

+

( )

Segunda derivada de orden

( )

+

Central

Izquierda

(para 3 pares de datos).

Para ello se procede a los mismos pasos anteriores con la diferencia de que ahora será la segunda derivada para el polinomio interpolador, de igual forma para el desarrollo de la serie de Taylor. ( ) ( )

(

+

( )

( )+(

+

)+ +

+

)(

[(

)( (

)(

)+(

( )

) )

)]

+

( )

La segunda derivada de la función de error: ( )

[(

( )

[ (

)( )+ (

)+(

)( )+ (

)+( )]

)(

)]

( )

( )

103


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

Evaluando: ( )

( )

( ) ( )

Derecha Central

( )

Izquierda

Teniendo de esta forma las siguientes fórmulas:

Por la derecha:

Central:

Por la izquierda:

( )

+

+

( )

( )

( )

+

+

+

( )

Programación Interfaz gráfica propuesta

104


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

Funciones por botón Botón “Capturar Y[i]”: Captura los valores para de datos ingresados.

y los guarda en un arreglo lineal. Muestra el número

Botón “Mostrar datos +”: Muestra los valores de , ubicando el primer dato debajo de la etiqueta la primera vez que se presiona, las siguientes ocasiones se recorren los datos hacia la izquierda, mostrando los datos siguientes para poder visualizar todos. Botón “Mostrar datos -”: Muestra los valores de , ubicando el primer dato debajo de la etiqueta la primera vez que se presiona, las siguientes ocasiones recorre los datos hacia la derecha, mostrando los datos anteriores, esto es cuando se han recorrido previamente hacia la izquierda. Botón “Reset”: Borra los datos escritos en el formulario y reinicia la variable que posiciona los datos en el arreglo. Posiciona el puntero en el primer Edit.

105


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

Código de programación //---------------------------------------------------------------#include <vcl.h> #pragma hdrstop #include "Unit1.h" //---------------------------------------------------------------#pragma package(smart_init) #pragma resource "*.dfm" int i=2,a,b; double Y[100],y0,y1,y2,h,der,cen,izq; TForm1 *Form1; //---------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //---------------------------------------------------------------void __fastcall TForm1::FormActivate(TObject *Sender) { Edit1->SetFocus(); } //---------------------------------------------------------------//botón capturar Y[i] void __fastcall TForm1::Button1Click(TObject *Sender) { Y[i]=Edit1->Text.ToDouble(); Label2->Caption="n= "+AnsiString(i-1); Edit1->Text=""; Edit1->SetFocus(); a=i-4; i++; b=1; } //---------------------------------------------------------------//botón mostrar datos + void __fastcall TForm1::Button2Click(TObject *Sender) {

106


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA if(b==1){i=-1;} if(i<a){i++;} Edit3->Text=AnsiString(Y[i]); Edit4->Text=AnsiString(Y[i+1]); Edit5->Text=AnsiString(Y[i+2]); Edit6->Text=AnsiString(Y[i+3]); Edit7->Text=AnsiString(Y[i+4]); b=0; } //---------------------------------------------------------------//botón mostrar datos void __fastcall TForm1::Button3Click(TObject *Sender) { if(b==1){i=1;} if(i!=0){i--;} Edit3->Text=AnsiString(Y[i]); Edit4->Text=AnsiString(Y[i+1]); Edit5->Text=AnsiString(Y[i+2]); Edit6->Text=AnsiString(Y[i+3]); Edit7->Text=AnsiString(Y[i+4]); b=0; } //---------------------------------------------------------------//botón primera void __fastcall TForm1::Button4Click(TObject *Sender) { h=Edit2->Text.ToDouble(); y0=Edit5->Text.ToDouble(); y1=Edit6->Text.ToDouble(); y2=Edit7->Text.ToDouble(); der=(-y2+(4*y1)-(3*y0))/(2*h); cen=(y2-y0)/(2*h); izq=((3*y2)-(4*y1)+y0)/(2*h); Edit8->Text=AnsiString(der); Edit9->Text=AnsiString(cen); Edit10->Text=AnsiString(izq); } //----------------------------------------------------------------

107


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

//botón segunda void __fastcall TForm1::Button5Click(TObject *Sender) { h=Edit2->Text.ToDouble(); y0=Edit5->Text.ToDouble(); y1=Edit6->Text.ToDouble(); y2=Edit7->Text.ToDouble(); cen=(y2-(2*y1)+y0)/(h*h) ; Edit11->Text=AnsiString(cen); } //---------------------------------------------------------------//botón reset void __fastcall TForm1::Button6Click(TObject *Sender) { Edit1->Text=""; Edit2->Text=""; Edit3->Text=""; Edit4->Text=""; Edit5->Text=""; Edit6->Text=""; Edit7->Text=""; Edit8->Text=""; Edit9->Text=""; Edit10->Text=""; Edit11->Text=""; Edit1->SetFocus(); Label2->Caption="n="; a=2; } //----------------------------------------------------------------

108


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

9.- Integración Numérica

Como sabemos una aplicación de la integral es el cálculo del área bajo la curva, pues bien ahora hallaremos eso a partir de una serie de datos ya dados o conocidos los cuales pasan por la curva o polinomio ( ). Para poder desarrollar la integración numérica se procederán a realizar los siguientes pasos: 1.- Desarrollar la serie de Taylor alrededor de pares de puntos Orden 1 2 3

Pares de puntos 2 3 4

2.- Integrar a ( ) ( ) 3.- ∫ ( )

( )+ ( )

( )+ ( )

Veremos dos casos o más bien dos métodos:  Método del trapecio.  Método de Simpsom

.

109


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

Regla del Trapecio ( )

( )+ ( )

( )

( ) ( )

(

+ (

+

)+

) ( )

(

)(

)

Tenemos que integrar: ( )

∫ *

(

(

( )

(

+

)+

+∫

(

+

+

)

)

)

*

(

)

+

+

+

Integrando la función de error: ( )

( )

∫ (

)(

)

Integrando por partes, donde: (

) (

)

(

)

110


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

( )

( ) ( * ( )

)(

( *(

( )

( )

)

)(

∫ (

(*

(

)(

)

(

)(

∫ (

+

)

)

+ )

)

(

)

( )

)+

*(

)

(

)+

)

(∫ (

)

( ) ( *

)

( )

((

)

)

(

( )

+

( )

) )

(

[(

) ] )

( )

Sustituyendo, obtenemos que: ∫

( )

( )

Finalmente ∫

( )

+

( )

Regla de Simpson 1/3

( ) ( )

+

( )+( (

)( )+

)( +

) (

( )

)(

)

111


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

Integrando: [ ]

(

(

)

[(

∫ (

) ]

(

)

(

)

)

( *

)( )

)( )

) ( *

)

)(

(

(

)

∫ (

+

(

)(

(

)(

[(

) ]

)

)

∫ (

+ (

)(

) )

)

)

∫ (

)

((

)

∫ (

(

) ]

) (

(

[(

)

)(

(

)

)(

(

) )

(

+

)

)

112


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

Sustituyendo, obtenemos que: ∫

( )

+

(

)+

)+( )

+

+ (

+

(

(

+

)

+

)

Programación Interfaz gráfica propuesta

Descripción por botón Botón “Área”: Lee los valores de y de (el salto). Utiliza las fórmulas de la regla del trapecio y de Simpson 1/3 para realizar los cálculos, con ayuda de una estructura de repetición „for’. Botón “Graficar”: Lee los valores de , y . Calcula los valores para sumando el salto más el valor anterior de . Traza la gráfica resultante de unir los puntos de la función descrita, sobre un eje coordenado. Botón “Reset”: Borra los datos escritos en el formulario y posiciona el puntero en el primer Edit.

113


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

Código de programación //---------------------------------------------------------------#include <vcl.h> #pragma hdrstop #include "Unit1.h" //---------------------------------------------------------------#pragma package(smart_init) #pragma link "PERFGRAP" #pragma resource "*.dfm" double Y[20], X[20], h, trapecio, simpson; int k; TForm1 *Form1; //---------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //---------------------------------------------------------------//botón área void __fastcall TForm1::Button1Click(TObject *Sender) { Y[0]=Edit1->Text.ToDouble(); Y[1]=Edit2->Text.ToDouble(); Y[2]=Edit3->Text.ToDouble(); Y[3]=Edit4->Text.ToDouble(); Y[4]=Edit5->Text.ToDouble(); Y[5]=Edit6->Text.ToDouble(); Y[6]=Edit7->Text.ToDouble(); Y[7]=Edit8->Text.ToDouble(); Y[8]=Edit9->Text.ToDouble(); Y[9]=Edit10->Text.ToDouble(); Y[10]=Edit11->Text.ToDouble(); h=Edit13->Text.ToDouble(); trapecio=0; simpson=0; for(k=0;k<10;k++){ trapecio=trapecio+((Y[k]+Y[k+1])*(h/2));} for(k=0;k<9;k=k+2){

114


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA simpson=simpson+((Y[k]+(4*(Y[k+1]))+Y[k+2])*(h/3));} Edit14->Text=AnsiString(trapecio); Edit15->Text=AnsiString(simpson); } //---------------------------------------------------------------//botón graficar void __fastcall TForm1::Button2Click(TObject *Sender) { Y[0]=Edit1->Text.ToDouble(); Y[1]=Edit2->Text.ToDouble(); Y[2]=Edit3->Text.ToDouble(); Y[3]=Edit4->Text.ToDouble(); Y[4]=Edit5->Text.ToDouble(); Y[5]=Edit6->Text.ToDouble(); Y[6]=Edit7->Text.ToDouble(); Y[7]=Edit8->Text.ToDouble(); Y[8]=Edit9->Text.ToDouble(); Y[9]=Edit10->Text.ToDouble(); Y[10]=Edit11->Text.ToDouble(); h=Edit13->Text.ToDouble(); X[0]=Edit12->Text.ToDouble(); for (k=1;k<=10;k++){ X[k]=X[k-1]+h; } Canvas->Pen->Color=clBlack; Canvas->Pen->Width=3; Canvas->PenPos=TPoint(672,145); Canvas->LineTo(672,490); Canvas->PenPos=TPoint(376,311); Canvas->LineTo(968,311); Canvas->Pen->Width=2; Canvas->PenPos=TPoint(672,145); Canvas->LineTo(668,149); Canvas->PenPos=TPoint(672,145); Canvas->LineTo(676,149); Canvas->PenPos=TPoint(968,311); Canvas->LineTo(964,307); Canvas->PenPos=TPoint(968,311); Canvas->LineTo(964,315); Canvas->Pen->Color=0x00C08080;

115


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA Canvas->Pen->Width=2; Canvas->PenPos=TPoint(672+X[0]*15,311); for(k=0; k<=10;k++) { Canvas->LineTo(672+(X[k])*15,311-(Y[k])*15); } Canvas->LineTo(672+(X[10])*15,311); } //---------------------------------------------------------------//botón reset void __fastcall TForm1::Button3Click(TObject *Sender) { Form1->Visible=false; Form1->Visible=true; Edit1->Text=""; Edit2->Text=""; Edit3->Text=""; Edit4->Text=""; Edit5->Text=""; Edit6->Text=""; Edit7->Text=""; Edit8->Text=""; Edit9->Text=""; Edit10->Text=""; Edit11->Text=""; Edit12->Text=""; Edit13->Text=""; Edit1->SetFocus(); } //----------------------------------------------------------------

116


UNIVERSIDAD AUTĂ“NOMA DE CHIAPAS FACULTAD DE INGENIERĂ?A

10.- MĂŠtodo de Euler

Este mĂŠtodo nos servirĂĄ para la soluciĂłn de ecuaciones diferenciales de primer orden.

( ) En esta ecuaciĂłn encontramos lo que llamamos “PVIâ€? es decir, “problema de valor inicialâ€?, para desarrollar este mĂŠtodo se procede de la manera siguiente:

1.- Poner a la ecuaciĂłn en la forma (

)

( )

2.- Dividir en intervalos iguales (

+

)

(

)

( )

En este paso se pasa de una funciĂłn continua a una funciĂłn discreta. Posteriormente hay que aproximar a la derivada con su diferencia finita. ( ) 3.- Sustituyendo (2) y (3) en (1) tenemos (

đ?‘Śđ?‘›

đ?‘Śđ?‘› +

)

đ?‘“(đ?‘Ľđ?‘› đ?‘Śđ?‘› )

FĂłrmula de recurrencia

De esta forma llegamos a la fĂłrmula de recurrencia, la soluciĂłn se traduce en un problema de valor inicial (PVI).

117


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

Método de Euler mejorado E++ (

) se sustituye por un promedio: (

)

(

)

Valor anterior. (

(

)

)+ (

)

Se tiene la ecuación: (

+

*

)+ ( (

)

)+ (

( ) )

+

( )

En donde se aprecia que el término se encuentra en los dos miembros de la ecuación, por lo que tenemos que hay que despejar.

Ejemplo: Encontrar la fórmula de recurrencia para resolver la ecuación diferencial de manera numérica con las condiciones iniciales dadas. [

+

]

Euler: Pasar a la forma

(

) + + + (

)+

Fórmula de recurrencia

118


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

Una vez encontrado la fórmula se evalúa en los datos y se obtiene: (

(

)) +

(

(

(

)) + (

)(

) )

(

)

… Euler mejorado E++: +

+

+

+

+ ( + ) +

+ +

(

( )+ (

)

(

(

( + )+

)

( +

+

)+ (

+

)

)

+

(

+

( )

)

(

+ (

Fórmula de recurrencia

(

)

)

)

+

(

)

)

119


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

Programación: Interfaz gráfica propuesta

Descripción por botón Botón “Euler”: Lee los valores para para y

y .

, dentro de una estructura de repetición calcula los valores

Para : sumando (el salto) al valor anterior. Para con ayuda de la fórmula de recurrencia anteriormente calculada con el método de Euler simple. Muestra dichos valores en los Edits correspondientes. Botón “Euler ++”: Lee los valores para para y

y .

, dentro de una estructura de repetición calcula los valores

120


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

Para : sumando el salto al valor anterior. Para con ayuda de la fórmula de recurrencia calculada anteriormente con el método de Euler mejorado. Muestra dichos valores en los Edits correspondientes. Botón “Graficar”: Realiza una gráfica de la función con los puntos calculados sobre un eje coordenado. Botón “Reset”: Borra los datos escritos en el formulario y posiciona el puntero en el primer Edit.

121


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

Código de programación //---------------------------------------------------------------#include <vcl.h> #pragma hdrstop #include "Unit1.h" //---------------------------------------------------------------#pragma package(smart_init) #pragma link "PERFGRAP" #pragma resource "*.dfm" #include <math.h> double Y[20], X[20], h, a, b; int k; TForm1 *Form1; //---------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //---------------------------------------------------------------//botón euler void __fastcall TForm1::Button1Click(TObject *Sender) { h=Edit1->Text.ToDouble(); X[0]=Edit2->Text.ToDouble(); Y[0]=Edit3->Text.ToDouble(); for(k=1;k<=10;k++) { Y[k]=(Y[k-1]*(1-2*h))+(X[k-1]*(exp(2*X[k-1]))*h); X[k]=X[k-1]+h; } Edit4->Text=AnsiString(X[1]); Edit5->Text=AnsiString(X[2]); Edit6->Text=AnsiString(X[3]); Edit7->Text=AnsiString(X[4]); Edit8->Text=AnsiString(X[5]); Edit9->Text=AnsiString(X[6]); Edit10->Text=AnsiString(X[7]); Edit11->Text=AnsiString(X[8]); Edit12->Text=AnsiString(X[9]); Edit13->Text=AnsiString(X[10]);

122


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA Edit14->Text=AnsiString(Y[1]); Edit15->Text=AnsiString(Y[2]); Edit16->Text=AnsiString(Y[3]); Edit17->Text=AnsiString(Y[4]); Edit18->Text=AnsiString(Y[5]); Edit19->Text=AnsiString(Y[6]); Edit20->Text=AnsiString(Y[7]); Edit21->Text=AnsiString(Y[8]); Edit22->Text=AnsiString(Y[9]); Edit23->Text=AnsiString(Y[10]); } //botón euler++ //---------------------------------------------------------------void __fastcall TForm1::Button2Click(TObject *Sender) { h=Edit1->Text.ToDouble(); X[0]=Edit2->Text.ToDouble(); Y[0]=Edit3->Text.ToDouble(); a=(1-h)/(1+h); b=h/(2+2*h); for(k=1;k<=10;k++) { X[k]=X[k-1]+h; Y[k]=(a*Y[k-1])+(b*((X[k-1]*exp(2*X[k-1]))+(X[k]*exp(2*X[k]))) ); } Edit4->Text=AnsiString(X[1]); Edit5->Text=AnsiString(X[2]); Edit6->Text=AnsiString(X[3]); Edit7->Text=AnsiString(X[4]); Edit8->Text=AnsiString(X[5]); Edit9->Text=AnsiString(X[6]); Edit10->Text=AnsiString(X[7]); Edit11->Text=AnsiString(X[8]); Edit12->Text=AnsiString(X[9]); Edit13->Text=AnsiString(X[10]); Edit14->Text=AnsiString(Y[1]); Edit15->Text=AnsiString(Y[2]); Edit16->Text=AnsiString(Y[3]); Edit17->Text=AnsiString(Y[4]); Edit18->Text=AnsiString(Y[5]); Edit19->Text=AnsiString(Y[6]); Edit20->Text=AnsiString(Y[7]); Edit21->Text=AnsiString(Y[8]);

123


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA Edit22->Text=AnsiString(Y[9]); Edit23->Text=AnsiString(Y[10]); } //---------------------------------------------------------------//botón graficar void __fastcall TForm1::Button3Click(TObject *Sender) { Canvas->Pen->Color=clBlack; Canvas->Pen->Width=3; Canvas->PenPos=TPoint(272,112); Canvas->LineTo(272,392); Canvas->PenPos=TPoint(256,382); Canvas->LineTo(864,382); Canvas->Pen->Width=2; Canvas->PenPos=TPoint(268,116); Canvas->LineTo(272,112); Canvas->LineTo(276,116); Canvas->PenPos=TPoint(860,378); Canvas->LineTo(864,382); Canvas->LineTo(860,386); Canvas->Pen->Color=0x00C08080; Canvas->Pen->Width=2; Canvas->PenPos=TPoint(272+X[0]*150,382-Y[0]*150); for(k=1; k<=10;k++) { Canvas->LineTo(272+X[k]*150,382-Y[k]*150); } } //---------------------------------------------------------------//botón reset void __fastcall TForm1::Button4Click(TObject *Sender) { Edit1->Text=""; Edit2->Text=""; Edit3->Text=""; Edit4->Text=""; Edit5->Text=""; Edit6->Text=""; Edit7->Text="";

124


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA Edit8->Text=""; Edit9->Text=""; Edit10->Text=""; Edit11->Text=""; Edit12->Text=""; Edit13->Text=""; Edit14->Text=""; Edit15->Text=""; Edit16->Text=""; Edit17->Text=""; Edit18->Text=""; Edit19->Text=""; Edit20->Text=""; Edit21->Text=""; Edit22->Text=""; Edit23->Text=""; Edit1->SetFocus(); Form1->Visible=false; Form1->Visible=true; } //----------------------------------------------------------------

125


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

11.- Método de Runge-Kutta

A este método se le conoce también como Euler modificado. Es igual que el método de Euler mejorado pero en la ecuación de la pendiente no se despeja en la ecuación de Euler sin mejorar.

, sino que se evalúa

Euler mejorado

(

(

)

)+ (

+

(

)

(

En donde desaparece el término

)

(

Euler sin mejorar

)

)+ (

+

(

))

Euler modificado

, evitando despejar.

1. Poner de la forma: (

)

Usar un intervalo equidistante: +

+ (

)

(

)

2. Aproximar a la pendiente con el promedio y aproximar a la derivada con su diferencia finita: ( )+ ( + ( ))

126


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

(

+

)+

(

+

(

))

Considérese (

)

(

+

))

(

(

+

)

Podemos simplificar la fórmula de recurrencia a +

+

Ejemplo: ( )

+ Poner en la forma

( )

(

)

+ (

+

)

(

)

(

+

(

)

(

( )

( (

(

)

+

))

( )) (

)))

+

127


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

Programación Interfaz gráfica propuesta

Descripción por botón Botón “Calcular”: Lee los valores para para y

y .

, dentro de una estructura de repetición calcula los valores

Para : suma el valor anterior más el del salto. Para utiliza la fórmula de recurrencia calculada en el ejemplo antes mostrado; apoyándose de las variables auxiliares y . Muestra los resultados en los Edits correspondientes. Botón “Graficar”: Realiza una gráfica de la función con los puntos calculados sobre un eje coordenado. Botón “Reset”: Borra los datos escritos en el formulario y posiciona el puntero en el primer Edit.

128


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

Código de programación //---------------------------------------------------------------#include <vcl.h> #pragma hdrstop #include "Unit1.h" //---------------------------------------------------------------#pragma package(smart_init) #pragma link "PERFGRAP" #pragma resource "*.dfm" #include <math.h> double Y[20], X[20], h, k1, k2; int k; TForm1 *Form1; //---------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //---------------------------------------------------------------//botón calcular void __fastcall TForm1::Button1Click(TObject *Sender) { h=Edit1->Text.ToDouble(); X[0]=Edit2->Text.ToDouble(); Y[0]=Edit3->Text.ToDouble(); for(k=1;k<=10;k++) { X[k]=X[k-1]+h; k1=h*((exp(-2*X[k-1]))-(4*Y[k-1])); k2=h*((exp(-2*X[k]))-(4*(Y[k-1]+k1))); Y[k]=Y[k-1]+((k1+k2)/2); } Edit4->Text=AnsiString(X[1]); Edit5->Text=AnsiString(X[2]); Edit6->Text=AnsiString(X[3]); Edit7->Text=AnsiString(X[4]); Edit8->Text=AnsiString(X[5]); Edit9->Text=AnsiString(X[6]);

129


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA Edit10->Text=AnsiString(X[7]); Edit11->Text=AnsiString(X[8]); Edit12->Text=AnsiString(X[9]); Edit13->Text=AnsiString(X[10]); Edit14->Text=AnsiString(Y[1]); Edit15->Text=AnsiString(Y[2]); Edit16->Text=AnsiString(Y[3]); Edit17->Text=AnsiString(Y[4]); Edit18->Text=AnsiString(Y[5]); Edit19->Text=AnsiString(Y[6]); Edit20->Text=AnsiString(Y[7]); Edit21->Text=AnsiString(Y[8]); Edit22->Text=AnsiString(Y[9]); Edit23->Text=AnsiString(Y[10]); } //---------------------------------------------------------------//botón graficar void __fastcall TForm1::Button2Click(TObject *Sender) { Canvas->Pen->Color=clBlack; Canvas->Pen->Width=3; Canvas->PenPos=TPoint(272,112); Canvas->LineTo(272,392); Canvas->PenPos=TPoint(256,382); Canvas->LineTo(864,382); Canvas->Pen->Width=2; Canvas->PenPos=TPoint(268,116); Canvas->LineTo(272,112); Canvas->LineTo(276,116); Canvas->PenPos=TPoint(860,378); Canvas->LineTo(864,382); Canvas->LineTo(860,386); Canvas->Pen->Color=0x00C08080; Canvas->Pen->Width=2; Canvas->PenPos=TPoint(272+X[0]*150,382-(Y[0])*150); for(k=1; k<=10;k++) { Canvas->LineTo(272+X[k]*150,382-(Y[k])*150); } } //----------------------------------------------------------------

130


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

//botón reset void __fastcall TForm1::Button3Click(TObject *Sender) { Edit1->Text=""; Edit2->Text=""; Edit3->Text=""; Edit4->Text=""; Edit5->Text=""; Edit6->Text=""; Edit7->Text=""; Edit8->Text=""; Edit9->Text=""; Edit10->Text=""; Edit11->Text=""; Edit12->Text=""; Edit13->Text=""; Edit14->Text=""; Edit15->Text=""; Edit16->Text=""; Edit17->Text=""; Edit18->Text=""; Edit19->Text=""; Edit20->Text=""; Edit21->Text=""; Edit22->Text=""; Edit23->Text=""; Edit1->SetFocus(); Form1->Visible=false; Form1->Visible=true; } //----------------------------------------------------------------

131


UNIVERSIDAD AUTĂ“NOMA DE CHIAPAS FACULTAD DE INGENIERĂ?A

12.- MĂŠtodo de la serie de Taylor

Un desarrollo de la funciĂłn ( ) en el vecindario de ( ) estĂĄ dado por la ecuaciĂłn ( ), ( ) donde son las derivadas de orden evaluadas en el punto . ( )

( )

∑

(

)

(

)

( )

* (đ?‘›) es el orden de la derivada, no confundir con exponente.

Considerese (

para )

(

)(

) + (

)

(

+

(

) +

)( +

)

(

)

( )

En un problema de valor inicial PVI se dispone de un valor inicial ( ) y de una ecuaciĂłn del tipo ( ). (

)

( )

Usando un intervalo equidistante (

)

(

)

( )

ConsideraciĂłn: la segunda derivada de una funciĂłn compuesta. ( +

)

[ ( +

)] ( )

132


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

Sustituyendo ( ) y ( ) en ( ) (

+

)+

[

(

+

)]

( )

Ecuación de recurrencia

(

Donde podemos notar que los primeros términos ( + fórmula del método de Euler simple anteriormente vista.

)) son iguales a la

Ejemplo: Sea

+

;

(

)

Algoritmo.1. Encontrar las derivadas parciales Dado que (

y

)

[ +

(

)

[

]

+

]

[ +

+

]

2. Finalmente sustituir en la ecuación ( ) +

( +

+ (

)+ +

)+

[

+ [

+

+

+

] ]

133


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

Programación Interfaz gráfica propuesta:

Programación por botón: Botón “Calcular”: Lee los valores para y . Si muestra un mensaje indicando que dicho valor debe ser distinto de cero, borra y posiciona el puntero en el Edit para corregirlo. Si calcula los valores para y dentro de una estructura de repetición. Para : suma el valor anterior de dicha variable más el del salto. Para : utiliza la fórmula de recurrencia calculada en el ejemplo. Por último, muestra los resultados en los Edits correspondientes. Botón “Graficar”: Realiza una gráfica de la función con los puntos calculados sobre un eje coordenado. Botón “Reset”: Borra los datos escritos en el formulario y posiciona el puntero en el primer Edit.

134


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

Código de programación //---------------------------------------------------------------#include <vcl.h> #pragma hdrstop #include "Unit1.h" //---------------------------------------------------------------#pragma package(smart_init) #pragma link "PERFGRAP" #pragma resource "*.dfm" #include <math.h> double Y[20], X[20], h,a,b; int k; TForm1 *Form1; //---------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //---------------------------------------------------------------//botón calcular void __fastcall TForm1::Button1Click(TObject *Sender) { h=Edit1->Text.ToDouble(); X[0]=Edit2->Text.ToDouble(); Y[0]=Edit3->Text.ToDouble(); if(X[0]==0){ ShowMessage("x0 debe ser distinto de cero."); Edit2->Text=""; Edit2->SetFocus();} else{ for(k=1;k<=10;k++) { a=exp(X[k-1])/(X[k-1]); b=exp(X[k-1])/(X[k-1]*X[k-1]); Y[k]=Y[k-1]+(h*(Y[k-1]+a))+((h*h/2)*(Y[k-1]+2*a-b)); X[k]=X[k-1]+h; }

135


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA Edit4->Text=AnsiString(X[1]); Edit5->Text=AnsiString(X[2]); Edit6->Text=AnsiString(X[3]); Edit7->Text=AnsiString(X[4]); Edit8->Text=AnsiString(X[5]); Edit9->Text=AnsiString(X[6]); Edit10->Text=AnsiString(X[7]); Edit11->Text=AnsiString(X[8]); Edit12->Text=AnsiString(X[9]); Edit13->Text=AnsiString(X[10]); Edit14->Text=AnsiString(Y[1]); Edit15->Text=AnsiString(Y[2]); Edit16->Text=AnsiString(Y[3]); Edit17->Text=AnsiString(Y[4]); Edit18->Text=AnsiString(Y[5]); Edit19->Text=AnsiString(Y[6]); Edit20->Text=AnsiString(Y[7]); Edit21->Text=AnsiString(Y[8]); Edit22->Text=AnsiString(Y[9]); Edit23->Text=AnsiString(Y[10]); } } //---------------------------------------------------------------//botón graficar void __fastcall TForm1::Button2Click(TObject *Sender) { Canvas->Pen->Color=clBlack; Canvas->Pen->Width=3; Canvas->PenPos=TPoint(272,112); Canvas->LineTo(272,392); Canvas->PenPos=TPoint(256,382); Canvas->LineTo(864,382); Canvas->Pen->Width=2; Canvas->PenPos=TPoint(268,116); Canvas->LineTo(272,112); Canvas->LineTo(276,116); Canvas->PenPos=TPoint(860,378); Canvas->LineTo(864,382); Canvas->LineTo(860,386); Canvas->Pen->Color=0x00C08080; Canvas->Pen->Width=2;

136


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA Canvas->PenPos=TPoint(272+X[0]*45,382-(Y[0])*45); for(k=1; k<=10;k++) { Canvas->LineTo(272+X[k]*45,382-(Y[k])*45); } } //---------------------------------------------------------------//botón reset void __fastcall TForm1::Button3Click(TObject *Sender) { Edit1->Text=""; Edit2->Text=""; Edit3->Text=""; Edit4->Text=""; Edit5->Text=""; Edit6->Text=""; Edit7->Text=""; Edit8->Text=""; Edit9->Text=""; Edit10->Text=""; Edit11->Text=""; Edit12->Text=""; Edit13->Text=""; Edit14->Text=""; Edit15->Text=""; Edit16->Text=""; Edit17->Text=""; Edit18->Text=""; Edit19->Text=""; Edit20->Text=""; Edit21->Text=""; Edit22->Text=""; Edit23->Text=""; Edit1->SetFocus(); Form1->Visible=false; Form1->Visible=true; } //----------------------------------------------------------------

137


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

13.-Método de diferencias finitas

Las ecuaciones diferenciales parciales son representaciones matemáticas que modelan la “evolución temporal y espacial” de sistemas físicos reales. Clasificación Se clasifican en base a sus “características de propagación” en: hiperbólicas, parabólicas y elípticas. Se diferencian también porque en ellas aparecen las derivadas (todas de segundo orden respecto al espacio) :

,

y sin derivada, respectivamente.

Hiperbólicas

Puede ser que la raíz de su nombre se deba a que esta ecuación tiene la forma de una ecuación hiperbólica.

138


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

Parabólicas

De la misma manera puede ser que la raíz de su nombre se deba a que efectivamente también posee la forma de una ecuación parabólica.

Elípticas (

+

)

Así también esta. +

139


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

Hiperbólicas

Dónde: : Es la velocidad de propagación.

( +

)

Parabólicas [

]

( )

“Ecuación de difusión”. Dónde: (

⃗): Es el coeficiente de difusión. ( ⃗ ): Es la densidad del material que se difunde en dirección de ⃗.

Describe procesos que tienen gradientes de densidad de un material que se difunde. Se parte de la ecuación de continuidad +

( )

“Ecuación de continuidad”.

140


UNIVERSIDAD AUTĂ“NOMA DE CHIAPAS FACULTAD DE INGENIERĂ?A

DĂłnde: ⃗: Es el flujo del material que se difunde. Un cambio de densidad corresponde a una diferencia entre el flujo entrante y el flujo saliente. đ?‘‘đ?‘˘ đ?‘‘đ?‘Ą

đ??˝đ?‘–

đ??˝đ?‘–

DĂłnde: : Es la densidad del material.

Ley de Fick ⃗

( )

DĂłnde: : Es el coeficiente de difusiĂłn. El flujo del material que se difunde corresponde al gradiente local de la densidad. ⌊

âŒŞ

Combinando (2) y (3) [

]

*Divergencia del gradiente. En una dimensiĂłn

(

) [

( ), es decir,

]

( )

constante. ( )

“EcuaciĂłn de difusiĂłnâ€?.

141


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

( (

)

(

+

)

+

)

+ (

)

Elípticas Ecuación de Poisson (

+

)

“Fuentes o pérdidas de calor interno”. Ausencia de derivada respecto al tiempo. Se aplican en sistemas con valores en la frontera. Ecuación de Laplace + ( +

(

) +

+ +

+

+

)

Método de Jacobi (

)

((

) +(

) +(

) +(

+(

) +(

)

) )

Método de Gauss-Seidel (

)

((

)

+(

) )

Los superíndices indican la posición respecto al tiempo y los subíndices, respecto al espacio.

142


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

Programación Interfaz propuesta:

Programación por botón: Botón “Jacobi”: Lee los valores iniciales del sistema, de los Edits en color gris, y los guarda en un arreglo bidimensional. Por defecto, los valores de los elementos de un arreglo son iguales a cero, lo cual evita la necesidad de escribir valores iniciales para los elementos a calcular, ubicados en el centro. Dentro de una estructura de repetición for calcula los elementos centrales del sistema haciendo un promedio de los 4 los valores más cercanos, ubicados arriba, abajo y a los costados; guardándolos en una variable auxiliar, puesto que los valores recién calculados serán utilizados hasta la siguiente iteración. Dentro de otra estructura de repetición for calcula el error de los elementos calculados, restando el valor inicial al valor final. Compara los datos para seleccionar el mayor, al cual tomaremos como error total. Reasigna el valor del elemento del sistema a la variable auxiliar correspondiente. Dependiendo del método que se utilice primero para calcular los valores centrales del sistema, imprime los datos en el lugar que corresponde.

143


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

Si se oprime en primer lugar el botón “Jacobi” muestra los resultados en los Edits resaltados en color azul; de lo contrario, muestra los resultados en los Edits en verde. Imprime en una etiqueta debajo del lugar donde se muestra el sistema, el método utilizado, el número de iteraciones y el error total. Botón “Jacobi”: Lee los valores iniciales del sistema, de los Edits en color gris, y los guarda en un arreglo bidimensional. Dentro de una estructura de repetición for calcula los elementos centrales del sistema haciendo un promedio de los 4 los valores más cercanos, ubicados arriba, abajo y a los costados; en este caso también utilizamos una variable auxiliar para calcular los valores, pues nos servirá para guardar el valor final sin perder el valor inicial de la variable. Calcula el error de los elementos calculados, restando el valor inicial al valor final. Compara los datos para seleccionar el mayor, al cual tomaremos como error total. Reasigna las variables. Si se oprime en primer lugar el botón “Gauss” muestra los resultados en los Edits resaltados en color azul; de lo contrario, muestra los resultados en los Edits en verde. Imprime en una etiqueta debajo del lugar donde se muestra el sistema, el método utilizado, el número de iteraciones y el error total. Botón “Reset”: Borra los datos escritos en el formulario y reinicia los contadores de iteraciones y la variable auxiliar.

144


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

Código de programación //---------------------------------------------------------------#include <vcl.h> #pragma hdrstop #include "Unit1.h" //---------------------------------------------------------------#pragma package(smart_init) #pragma resource "*.dfm" #include <math.h> double A[10][10], B[10][10], a[10][10], b[10][10], EA[10][10], EB[10][10],error1, error2; int i,j,w=0,jacobi=1, gauss=1; TForm1 *Form1; //---------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //---------------------------------------------------------------//botón Jacobi void __fastcall TForm1::Button1Click(TObject *Sender) { A[0][1]=Edit1->Text.ToDouble(); A[0][2]=Edit2->Text.ToDouble(); A[0][3]=Edit3->Text.ToDouble(); A[1][0]=Edit4->Text.ToDouble(); A[2][0]=Edit9->Text.ToDouble(); A[3][0]=Edit14->Text.ToDouble(); A[1][4]=Edit8->Text.ToDouble(); A[2][4]=Edit13->Text.ToDouble(); A[3][4]=Edit18->Text.ToDouble(); A[4][1]=Edit19->Text.ToDouble(); A[4][2]=Edit20->Text.ToDouble(); A[4][3]=Edit21->Text.ToDouble(); for(i=1;i<=3;i++){ for(j=1;j<=3;j++)

145


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA {a[i][j]=0.25*((A[i+1][j])+(A[i-1][j])+(A[i][j+1])+(A[i][j-1]));} } //uso de una variable auxiliar for(i=1;i<=3;i++){ for(j=1;j<=3;j++) { EA[i][j]=fabs((a[i][j])-(A[i][j]));

//cálculo del error

if((EA[i][j])>(EA[i][j+1])){ EA[i][j+1]=EA[i][j];} A[i][j]=a[i][j];} }

//reasignación de variables

error1=EA[1][3]; if(error1<EA[2][3]){error1=EA[2][3];} if(error1<EA[3][3]){error1=EA[3][3];} if(w==0||w==1) { Edit5->Text=AnsiString(A[1][1]); Edit6->Text=AnsiString(A[1][2]); Edit7->Text=AnsiString(A[1][3]); Edit10->Text=AnsiString(A[2][1]); Edit11->Text=AnsiString(A[2][2]); Edit12->Text=AnsiString(A[2][3]); Edit15->Text=AnsiString(A[3][1]); Edit16->Text=AnsiString(A[3][2]); Edit17->Text=AnsiString(A[3][3]); if(jacobi<2){ Label2->Caption="Jacobi "+ AnsiString(jacobi)+" iteración. Error= "+FormatFloat("0.##########", error1);} else{ Label2->Caption="Jacobi "+AnsiString(jacobi)+" iteraciones. Error= "+ FormatFloat("0.##########", error1);} } else{ Edit22->Text=AnsiString(A[1][1]); Edit23->Text=AnsiString(A[1][2]); Edit24->Text=AnsiString(A[1][3]); Edit25->Text=AnsiString(A[2][1]); Edit26->Text=AnsiString(A[2][2]); Edit27->Text=AnsiString(A[2][3]); Edit28->Text=AnsiString(A[3][1]); Edit29->Text=AnsiString(A[3][2]); Edit30->Text=AnsiString(A[3][3]);

146


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

if(jacobi<2){ Label3->Caption="Jacobi "+ AnsiString(jacobi)+" iteración. Error= "+ FormatFloat("0.##########", error1);} else{ Label3->Caption="Jacobi "+AnsiString(jacobi)+" iteraciones. Error= "+ FormatFloat("0.##########", error1);} } if(w==0){w=1;} jacobi++; } //---------------------------------------------------------------//botón Gauss void __fastcall TForm1::Button2Click(TObject *Sender) { B[0][1]=Edit1->Text.ToDouble(); B[0][2]=Edit2->Text.ToDouble(); B[0][3]=Edit3->Text.ToDouble(); B[1][0]=Edit4->Text.ToDouble(); B[2][0]=Edit9->Text.ToDouble(); B[3][0]=Edit14->Text.ToDouble(); B[1][4]=Edit8->Text.ToDouble(); B[2][4]=Edit13->Text.ToDouble(); B[3][4]=Edit18->Text.ToDouble(); B[4][1]=Edit19->Text.ToDouble(); B[4][2]=Edit20->Text.ToDouble(); B[4][3]=Edit21->Text.ToDouble(); for(i=1;i<=3;i++){ for(j=1;j<=3;j++){ b[i][j]=0.25*((B[i+1][j])+(B[i-1][j])+(B[i][j+1])+(B[i][j-1])); EB[i][j]=fabs((b[i][j])-(B[i][j])); B[i][j]=b[i][j]; } } error2=EB[1][3]; if(error2<EB[2][3]){error2=EB[2][3];} if(error2<EB[3][3]){error2=EB[3][3];}

147


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

if(w==0||w==2){ Edit5->Text=AnsiString(B[1][1]); Edit6->Text=AnsiString(B[1][2]); Edit7->Text=AnsiString(B[1][3]); Edit10->Text=AnsiString(B[2][1]); Edit11->Text=AnsiString(B[2][2]); Edit12->Text=AnsiString(B[2][3]); Edit15->Text=AnsiString(B[3][1]); Edit16->Text=AnsiString(B[3][2]); Edit17->Text=AnsiString(B[3][3]); if(gauss<2){ Label2->Caption="Gauss-Seidel "+ AnsiString(gauss)+" iteración. Error= "+FormatFloat("0.##########", error2);} else{ Label2->Caption="Gauss-Seidel "+AnsiString(gauss)+" iteraciones. Error= "+FormatFloat("0.##########", error2);} } else{ Edit22->Text=AnsiString(B[1][1]); Edit23->Text=AnsiString(B[1][2]); Edit24->Text=AnsiString(B[1][3]); Edit25->Text=AnsiString(B[2][1]); Edit26->Text=AnsiString(B[2][2]); Edit27->Text=AnsiString(B[2][3]); Edit28->Text=AnsiString(B[3][1]); Edit29->Text=AnsiString(B[3][2]); Edit30->Text=AnsiString(B[3][3]); if(gauss<2){ Label3->Caption="Gauss-Seidel "+ AnsiString(gauss)+" iteración. Error= "+ FormatFloat("0.##########", error2);} else{ Label3->Caption="Gauss-Seidel "+AnsiString(gauss)+" iteraciones. Error= "+ FormatFloat("0.##########", error2);} } if(w==0){w=2;} gauss++; } //----------------------------------------------------------------

148


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA //botón reset void __fastcall TForm1::Button3Click(TObject *Sender) { Edit1->Text=""; Edit2->Text=""; Edit3->Text=""; Edit4->Text=""; Edit5->Text=""; Edit6->Text=""; Edit7->Text=""; Edit8->Text=""; Edit9->Text=""; Edit10->Text=""; Edit11->Text=""; Edit12->Text=""; Edit13->Text=""; Edit14->Text=""; Edit15->Text=""; Edit16->Text=""; Edit17->Text=""; Edit18->Text=""; Edit19->Text=""; Edit20->Text=""; Edit21->Text=""; Edit22->Text=""; Edit23->Text=""; Edit24->Text=""; Edit25->Text=""; Edit26->Text=""; Edit27->Text=""; Edit28->Text=""; Edit29->Text=""; Edit30->Text=""; Label2->Caption=""; Label3->Caption=""; w=0; jacobi=1; gauss=1; } //----------------------------------------------------------------

149


UNIVERSIDAD AUTÓNOMA DE CHIAPAS FACULTAD DE INGENIERÍA

Créditos

Autor Intelectual: Dr. Rubén Herrera Galicia (Catedrático)

1° Edición: Frida Carolina Villalobos Rivas (Semestre Agosto-Diciembre 2012)

2° Edición (actual): Heri Jacob Villar Sánchez (Semestre Enero-Mayo 2013)

Manual de Métodos Numéricos Universidad Autónoma de Chiapas Facultad de Ingeniería Licenciatura en Ingeniería Civil Tuxtla Gutiérrez Chiapas

150


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.