View
114
Download
0
Category
Preview:
Citation preview
UNIVERSIDAD AUTNOMA DE CHIAPAS
FACULTAD DE INGENIERA
INGENIERA CIVIL
APUNTES DE
MTODOS NUMRICOS
2da Edicin
APUNTES DE
MTODOS NUMRICOS
No busques ser una persona de xito,
busca ser una persona de valores...
Albert Einstein.
Rubn Herrera Galicia
Frida Carolina Villalobos Rivas
Heri Jacob Villar Snchez
I. Solucin numrica de ecuaciones de una variable
1. Mtodo de Biseccin .4
2. Mtodo de Newton Raphson ...11
3. Mtodo de Lin Bairstow ..18
II. Solucin numrica de sistemas de ecuaciones lineales y no lineales
4. Mtodo de Jacobi: Sistemas de ecuaciones no lineales ..29
5. Mtodo de Gauss-Seidel ..52
6. Mtodo de Newton: Sistemas de ecuaciones no lineales 72
III. Interpolacin, derivacin e integracin numrica
7. Interpolacin de Newton y Lagrange ..83
8. Derivacin numrica ...97
Primera derivada ( )
Segunda derivada ( )
9. Integracin numrica .109
Mtodo del trapecio
Mtodo de Simpson 1/3
IV. Solucin numrica de ecuaciones diferenciales ordinarias
10. Mtodo de Euler y Euler mejorado .117
11. Mtodo de Runge-Kutta (Euler modificado) ..126
12. Mtodo de la Serie de Taylor .132
V. Solucin numrica de ecuaciones en derivadas parciales
13. Mtodo de diferencias finitas .138
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
4
Algoritmo
1. Escoger los valores del intervalo.
2. Comprobar la existencia de una raz en el intervalo [ ] , verificando que
( ) ( )
de no ser as, ser necesario regresar al paso 1 y escoger otros valores para .
3. Tomar
y calcular ( ).
4. Si ( ) , se encontr la raz de la funcin. Fin del mtodo. De lo contrario ir al
paso 5.
5. Sea T la tolerancia deseada ( el margen de error aceptado), si:
se encontr una aproximacin a la raz con un margen de error menor a T. Fin del
mtodo. De lo contrario ir al paso 6.
6. Si ( ) ( ) , entonces hacer y repetir desde 3. De lo contrario
hacer y repetir desde 3.
()
( )
( )
+
1.- Mtodo de Biseccin
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
5
En otras palabras:
El mtodo consiste en encontrar la raz de una funcin f(x) a partir de la biseccin de dos aproximaciones hechas a la raz.
Sabiendo la grfica de la funcin facilita su uso, de lo contrario hay que ser abusados, es por eso que la funcin se evala con las aproximaciones y luego se multiplican para ver que el producto sea negativo ( ( ) ( ) ).
Con esto nos damos cuenta si la raz se encuentra en el intervalo de las aproximaciones dadas. Porque si no estuviera en ese intervalo el producto sera positivo, ya que el resultado de su evaluacin seria de signos iguales ya sea ambos negativos o positivos y por lo tanto el intervalo no contendra a la raz, y debemos buscar otros .
Lo que el mtodo hace es ir acortando los intervalos, hasta que se hagan tan pequeos
que casi son la raz, y digo casi porque es una aproximacin a la raz, o hasta la tolerancia
que nosotros tengamos que ser casi igual a 0 ( ( ) ).
( ) ( ) > , es positivo,
no contiene a la raz
( ) ( ) > , es positivo,
no contiene a la raz
1)
3)
2)
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
6
Programacin del mtodo.
Ahora que conocemos el mtodo, tendremos la habilidad de pasarlo a una maquina o
computadora, es decir crear una aplicacin. A continuacin se utilizar el programa
Builder c++ para la creacin de dicha aplicacin.
Interfaz propuesta:
Descripcin de los botones de la aplicacin:
Botn Calcular producto:
Captura los valores del intervalo, evala la funcin en dichos puntos; calcula el producto y muestra el resultado debajo de la etiqueta ( ) ( ) .
Botn Calcular raz:
Captura los valores del intervalo y el margen de error aceptado; calcula el valor de y evala la funcin 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 contina el proceso calculando:
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
7
Si el resultado es menor al margen de error detiene el proceso y muestra los resultados; de lo contrario contina, 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 clculo de
Botn Calcular paso a pasito:
Calcula la raz de la funcin paso a paso y muestra los valores obtenidos en cada uno; es decir, captura los valores de del intervalo y calcula:
, ( ), ( ) ( ),
mostrndolos debajo de su respectiva etiqueta. Cuenta el nmero de iteraciones, adems de asignar un nuevo valor ha para realizar las siguientes, dependiendo de la condicin:
Si ( ) ( ) ; ( )
Si ( ) ( ) > ; ( )
Botn Reset:
Reinicia el nmero de iteraciones y borra los datos escritos en el formulario.
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
8
Cdigo de programacin:
//----------------------------
#include
#pragma hdrstop
#include "Unit1.h"
//----------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
#include
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)
{
}
//----------------------------
//botn 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(prodCaption=AnsiString(prod);}
else{
Label2->Caption="Escoja otros valores";}
}
//----------------------------
//botn calcular raz
void __fastcall TForm1::Button2Click(TObject *Sender)
{
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
9
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(deltaCaption=AnsiString(xm);
Label5->Caption=AnsiString(ym);
}
//--------------------------------------------------
//botn 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);
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
10
if(prod0){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="";
}
//----------------------------
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
11
Es un mtodo grfico para encontrar races 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 mtodo se basa en la interpretacin geomtrica de la derivada para obtener la frmula
de la recurrencia:
( )
( )
Partiendo de una funcin ( ) , cuya derivada es ( ) y recordando que:
( ) y
Entonces tenemos lo siguiente:
()
Raz
Pendiente = ()
()
()
() ()
2.- Mtodo de Newton Raphson
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
12
Despejando en la ecuacin, obtenemos:
( )
( )
Que es conocida como la frmula de Newton-Raphson.
Geomtricamente lo que est pasando con este mtodo 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 ms cerca de la raz, y este nuevo nos da otro valor que est mucho ms prximo
que el anterior, y as sucesivamente hasta acercarse a la raz o hasta que la deferencia sea
cercana a cero.
Casos especiales
a) ( ) , cuando suceda esto quiere decir que se encontr a la raz, aunque claro
mayormente es un nmero aproximado a cero.
b) ( ) , cuando suceda esto, debemos escoger otro valor para para poder aplicar la
formula, ya que no es posible la divisin entre cero.
c) El circulo vicioso, es cuando la derivada nos manda de nuevo al mismo lugar, es decir
caemos en un crculo vicioso y nunca encontrar la raz, porque esta no corta al eje de las x.
d) Divergencia aparente, cuando , | | > | |
Si observamos en la grfica
se van formando como una
especie de zigzag, donde las
aproximaciones son cada
vez menores y se acercan a
la raz.
La frmula se
vuelve a realizar
otra vez, cada vez
se acerca ms a la
raz, por eso se
llama de
recurrencia.
En la grfica observamos el
caso del crculo vicioso, al
cual no tendremos una
solucin por este mtodo,
hay que evitar caer en l.
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
13
Programacin del mtodo
Interfaz propuesta
Acciones por botn
Botn Calcular raz:
Lee los valores para y tolerancia, calcula ( ): si ( ) detiene el proceso, pues
significa que se encontr la raz, si ( ) contina el proceso calculando ( ). Si
( ) detiene el proceso al tratarse de un punto crtico (mximo o mnimo de la
funcin). Si ( ) contina calculando ( )
( ) y sumando 1 al contador de
iteraciones.
Dentro de una estructura de repeticin while calcula ( ) y ( ) con las mismas
condiciones: detener el proceso si un resultado es igual a cero.
Si el proceso continu, calcula: ( )
( ), | | y | | ;
compara estos ltimos y acta de acuerdo a las siguientes condiciones:
Si , imprime el mensaje: Crculo Vicioso. Seleccione otro valor de x1. y
detiene el proceso.
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
14
Si > , imprime el mensaje: El mtodo diverge aparentemente. Seleccione
otro valor de x. y detiene el proceso.
Si > y > , calcula ( ). Imprime , ( ) debajo de la etiqueta
correspondiente y el mensaje Raz aproximada. Detiene el proceso.
En caso de no cumplirse ninguna condicin, reasigna valores a las variables: y
y reinicia el bucle hasta encontrar la raz o hasta que se cumpla alguna condicin
de las arriba mencionadas.
Botn 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.
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
15
Cdigo de programacin
//----------------------------
#include
#pragma hdrstop
#include "Unit1.h"
//----------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
#include
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)
{
}
//----------------------------
//botn calcular raz
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 crtico. Seleccione otro valor
de x1.";
m=1;}
else{
x2=x1-(y1/dy1);
n++;}
}
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
16
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 crtico. 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="Crculo Vicioso. Seleccione otro valor de
x1.";
m=1;}
else if(s2>s1){
Label5->Caption="El mtodo diverge aparentemente.
Seleccione otro valor de x.";
m=1;}
else if (s2s2){
y3=x3*x3*x3-x3-1;
Label3->Caption=AnsiString(x3);
Label4->Caption=AnsiString(y3);
Label5->Caption="Raz aproximada.";
m=1;}
else{
x1=x2;
x2=x3;}
}
}
}
Label6->Caption = "Iteraciones +AnsiString(n);
}
//----------------------------
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
17
//botn 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 programara la aplicacin en lenguaje c++.
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
18
Este mtodo se usa para encontrar races de ecuaciones, tanto reales como imaginarias.
Se apoya en la factorizacin numrica, encontrando races 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 numricamente cuando y sean ceros o
cercanos a cero. Y entonces los factores de + ( ) + sern las races del polinomio
los cuales se obtienen mediante la frmula general.
Al hacer el producto del polinomio (2) tenemos
( ) +
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+ + +
+ (Residuo)
3.- Mtodo de Lin-Bairstow
Al hacer el producto
nos da trminos
semejantes, son los
que se sealan con
una flecha.
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
19
Se igualan los coeficientes de ambas funciones (1) y (2), ya que son iguales y tenemos
+
+ +
+ +
+ +
+
Donde se observa la siguiente regla:
+ +
Con excepcin de
Ahora despejamos a b en cada una
La condicin para la factorizacin del polinomio es que y sean iguales a cero, por lo tanto:
( ) ( )
Despejando a p de la ecuacin (3) y a q de la ecuacin (2)
( )
( )
Donde
La condicin para
que el polinomio sea
factorizable es que
y
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
20
El numerador es
igual a
Para definir el error tenemos las siguientes ecuaciones
Sustituyendo la ecuacin (5) en el valor de p recin calculado, tenemos
( )
Si corremos raya del lado derecho nos damos cuenta que el trmino es semejante a
Sustituyendo en la ecuacin a y despejando a tenemos la siguiente frmula:
+
( )
De la misma manera con la ecuacin (6) al realizar lo anterior llegamos a la siguiente
frmula:
+
( )
Las cuales son las frmulas que usar este mtodo para calcular los nuevos valores que
deben tomar p y q para que el polinomio pueda ser factorizable y de esta manera encontrar
las races buscadas del polinomio.
La ventaja que tiene este mtodo es que podemos encontrar las races tanto reales como
imaginarias del polinomio, esto se puede conocer mediante la aplicacin de la frmula
general a los valores para los cuales es factorizable la funcin ( ) en el polinomio
cuadrtico ( + + )
Se puede decir que:
Valor
inicial
Valor recin
Polinomio de orden
n Funcin Polinomio de orden n-2 Residu
Par de races
Dr. Herrera:
A partir de aqu
todas las frmulas
las anex yo
porque en el
anterior no estaban
todas
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
21
Hacer y leer
.
Calcular:
Checar
Si No
Calcular Nanchy
Checar que
| | ,
| |
Si
No
Text
Hacer
,
Algoritmo:
Estos son los pasos a seguir del mtodo de Lin-bairstow, el cual nos es til para conocer las
races imaginarias de un polinomio si es que las contiene.
Cabe recordar que las races imaginarias siempre vienen dadas por parejas ya que existe el
conjugado por cada raz imaginaria encontrada.
Est adaptado para un polinomio de grado n=5, para otros polinomios se usan hasta
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
22
Programacin
Interfaz grfica propuesta:
Programacin por botn:
Botn Paso a pasito:
Lee los valores para , la tolerancia, y si se requiere, tambin de y ,
de lo contrario su valor inicial es cero. Calcula y con las frmulas
anteriormente mencionadas; si es igual a cero muestra un mensaje advirtiendo que el
mtodo 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 nmero de
iteraciones del mtodo.
Botn De una patada:
Lee los valores para , la tolerancia, y si se requiere, tambin de y ,
de lo contrario su valor inicial es cero. Dentro de una estructura de repeticin while
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
23
calcula y ; si es igual a cero imprime un mensaje advirtiendo que el
mtodo no funciona con el polinomio indicado y detiene el proceso, en caso contrario
contina 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 clculos, con los nuevos valores de y . Si el contador de
iteraciones es mayor que 200 muestra un mensaje advirtiendo que el mtodo no converge
para el polinomio indicado. Imprime , el error y el nmero de
iteraciones del mtodo.
Botn Calcular races:
Calcula las dos primeras races del polinomio con la frmula 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 raz, imprimindolas en el Edit correspondiente. De lo contrario, calcula las races
reales y las imprime en el Edit que corresponde.
Botn 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.
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
24
Cdigo de programacin
//----------------------------------------------------------------
#include
#pragma hdrstop
#include "Unit1.h"
//----------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
#include
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;
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
25
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 mtodo 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 (errorCaption="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)
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
26
{
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 mtodo 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 (errorCaption="El error es menor a la tolerancia establecida.";
m=1;}
else{
p=p2;
q=q2;
i++;}
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
27
if(i>200){
Label6->Caption="El mtodo no converge para dicha funcin.";
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 races
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 raz
ixr=-p/2;
//parte imaginaria de la raz
ix=(pow(d,0.5))/2;
Edit19->Text=FormatFloat("0.####",ixr)+ " + " +
FormatFloat("0.####",ix)+" i";
Edit20->Text=FormatFloat("0.####",ixr)+ " - " +
FormatFloat("0.####",ix)+" i";
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
28
}
}
//----------------------------------------------------------------
//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="Nmero de iteraciones.";
i=0;
k=0;
}
//----------------------------------------------------------------
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
29
Este mtodo nos sirve para resolver ecuaciones lineales. Supongamos el siguiente sistema
de ecuaciones:
+ + +
+ + +
+ + +
+ + +
Este mtodo trata de calcular un nuevo valor para cada variable, tomando como base el
sistema de ecuaciones, para desarrollar las frmulas debemos despejar una variable por
cada ecuacin, con ellas obtendremos los nuevos valores que nos acercaran a
las soluciones del sistema:
Para que se pueda desarrollar este mtodo, los coeficientes de la diagonal deben ser
distintos de cero:
A las ecuaciones anteriores tambin la podemos representar de la siguiente manera, es decir
le podemos dar la siguiente correspondencia:
4.- Mtodo de Jacobi
Las condiciones que se
deben cumplir son:
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
30
Esta son las frmulas que usar este mtodo para calcular los nuevos valores de cada una de
las variables, esta accin se llevar a cabo hasta que lleguemos a la tolerancia o una
aproximacin cercana a cero. Para ello nos ayudamos en la siguiente frmula de error.
| |
| |
| |
| |
Donde el criterio de paro ser:
( )
Convergencia del mtodo
Para que lleguemos a la solucin 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 mtodo 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 rengln.
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
31
A veces la matriz de un sistema de ecuaciones no es diagonalmente dominante pero
cuando se cambian el orden de las ecuaciones o las incgnitas 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 dbilmente dominante, o
en su defecto que sea aparentemente dominante o no dominante.
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
32
Recordemos que:
Reordenar el sistema y colocar en la diagonal los coeficientes de mayor valor absoluto,
ello puede hacer converger hacia la solucin
Ahora podemos decir lo siguiente de un sistema:
a).- Fuertemente dominante:
( ) ( ) ( ) ( )
b).- Dbilmente dominante:
( ) ( ) ( ) ( ) ( )
Donde + + +
Esta son las condiciones que debe cumplir el sistema para que el mtodo pueda converger a
una raz o solucin del sistema, mientras el sistema sea convergente llegaremos a una
solucin, se pueden tomar distintas rutas, pero si todas convergen, entonces llegaremos a
una solucin.
De esta forma sabremos si el sistema converge a una solucin, de lo contrario el mtodo no
nos garantiza encontrar la solucin al sistema de ecuaciones.
Valores iniciales
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
33
Programacin:
Interfaz grfica propuesta
Interpretacin por botn:
Botn 2x2:
El formulario muestra por defecto un arreglo matricial de 4x4, al presionar el botn oculta y
reordena los Edits del formulario, de tal forma que se muestre slo un arreglo de 2x2;
oculta tambin todos los Edits relacionados con las variables que no forman parte del
sistema de ecuaciones.
Botn 3x3:
Oculta y reordena los Edits del formulario, de tal forma que se muestre slo un arreglo
matricial de 3x3; oculta tambin todos los Edits relacionados con las variables que no
forman parte del sistema de ecuaciones.
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
34
Botn 4x4:
Muestra y reordena todos los Edits del formulario, en la forma en que se encontraban
originalmente.
Botn 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
condicin imprime una advertencia diciendo que los elementos de la diagonal principal
deben ser distintos de cero y desactiva los botones Calcular aproximacin y Calcular
paso a pas0. De lo contrario comprueba que la matriz sea dominante, comparando los
elementos de la diagonal con los dems:
Si el valor absoluto de cada elemento de la diagonal es mayor a la suma de los
valores absolutos de los dems elementos de la fila donde se encuentra, imprime un
mensaje diciendo que la matriz es fuertemente dominante.
Si el valor absoluto de uno o ms elementos de la diagonal es igual a la suma de los
valores absolutos de los dems elementos de la fila donde se encuentra, sin que
ninguno sea menor que dicha suma, imprime un mensaje diciendo que la matriz es
dbilmente dominante.
Si no cumple ninguna condicin quiere decir que no es una matriz dominante por lo
que es posible que el mtodo no sea convergente para la matriz en cuestin, por lo
que imprime un mensaje que advierte que no se garantiza la convergencia del
mtodo, y desactiva el botn Calcular aproximacin.
Por ltimo normaliza los coeficientes de las ecuaciones anteriormente mostradas, con los
datos necesarios, dependiendo del orden de la matriz.
Botn Calcular aproximacin:
Lee el valor de la tolerancia deseada y los valores iniciales de las variables a calcular,
dependiendo del orden de la matriz.
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
35
Para matrices de orden 4x4: .
Para matrices de orden 3x3: .
Para matrices de orden 2x2: .
Dentro de una estructura de repeticin 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 recin calculado. Compara los
valores absolutos de los errores con la tolerancia establecida y si todos son menores a sta,
imprime un mensaje sealando que se ha encontrado una aproximacin, sustituye los
nuevos valores en las ecuaciones originales para comprobar los resultados y los imprime, al
igual que los valores recin calculados y el error de cada uno en los Edits correspondientes.
Tambin muestra un mensaje con el nmero de iteraciones realizadas y detiene el proceso.
De no cumplir la condicin: Reasigna valores a las variables, siendo ahora el valor inicial
igual al recin calculado ( ) y aumenta en uno el contador de iteraciones. Reinicia el
proceso.
Botn 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 recin 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 recin calculado. Compara los
valores absolutos de los errores con la tolerancia establecida y si todos son menores a sta,
imprime un mensaje sealando que se ha encontrado una aproximacin. Sustituye los
nuevos valores en las ecuaciones originales para comprobar los resultados.
Reasigna valores a las variables, siendo ahora el valor inicial igual al recin calculado
( ). Imprime los valores recin calculados, sus respectivos errores y el valor de la
ecuacin en funcin de los nuevos valores en los Edits correspondientes. Tambin imprime
un mensaje con el nmero de iteraciones, y aumenta en uno el contador.
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
36
Cdigo de programacin:
//----------------------------------------------------------------
#include
#pragma hdrstop
#include "Unit1.h"
//----------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
#include
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)
{
}
//----------------------------------------------------------------
//botn 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;
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
37
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;
}
//----------------------------------------------------------------
//botn 3x3
void __fastcall TForm1::Button6Click(TObject *Sender)
{
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
38
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;
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
39
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;
}
//----------------------------------------------------------------
//botn 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;
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
40
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;
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
41
Edit37->Visible=true;
Edit1->SetFocus();
n=4;
}
//----------------------------------------------------------------
//botn 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= fabs(a1)+fabs(a2)+fabs(a3);
s2= fabs(b0)+fabs(b2)+fabs(b3);
s3= fabs(c0)+fabs(c1)+fabs(c3);
s4= fabs(d0)+fabs(d1)+fabs(d2);
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
42
q1=s1/fabs(a0);
q2=s2/fabs(b1);
q3=s3/fabs(c2);
q4=s4/fabs(d3);
m=q1+q2+q3+q4;
if(q1Enabled=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();
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
43
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(q1Enabled=true;}
else if(q1Caption="El mtodo 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;
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
44
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(q1Enabled=true;
Button3->Enabled=true;}
else if(q1Enabled=true;}
else{
Label3->Caption="El mtodo 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;
}
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
45
//----------------------------------------------------------------
//botn calcular aproximacin
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(DxText=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);
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
46
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(DxText=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;
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
47
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(DxText=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;
}
//----------------------------------------------------------------
//botn calcular paso a paso
void __fastcall TForm1::Button3Click(TObject *Sender)
{
if(n==4){
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
48
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(DxText=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;}
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
49
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(DxText=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="";}
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
50
x2=F0-(A1*y1);
y2=F1-(B0*x1);
dx=x2-x1;
dy=y2-y1;
Dx=fabs(dx);
Dy=fabs(dy);
if(DxText=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++;
}
//----------------------------------------------------------------
//botn 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="";
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
51
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;
}
//----------------------------------------------------------------
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
52
Este mtodo es similar al mtodo anterior, el de Jacobi, tambin 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 dems variables:
Recordemos la ecuacin del mtodo de Jacobi, ahora usando los nuevos valores ya
calculados. De esta forma es ms rpido el proceso.
De esta forma al igual que el mtodo de Jacobi, para un nmero n+1 de variables,
necesitar un nmero n de valores iniciales.
Las interacciones son de la misma manera que el mtodo anterior, de igual forma el criterio
de paro y el criterio para la convergencia del mtodo sern las mismas que para el mtodo
de Jacobi, por lo que no se vuelven a enunciar en esta seccin, queda al lector regresar al
tema anterior para revisar las formulas y los criterios de convergencia.
5.- Mtodo de Gauss Siedel
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
53
Programacin:
Interfaz grfica propuesta
Interpretacin por botn
Botn 2x2:
El formulario muestra por defecto un arreglo matricial de 4x4, al presionar el botn oculta y
reordena los Edits del formulario, de tal forma que se muestre slo un arreglo de 2x2;
oculta tambin todos los Edits relacionados con las variables que no forman parte del
sistema de ecuaciones.
Botn 3x3:
Oculta y reordena los Edits del formulario, de tal forma que se muestre slo un arreglo
matricial de 3x3; oculta tambin todos los Edits relacionados con las variables que no
forman parte del sistema de ecuaciones.
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
54
Botn 4x4:
Muestra y reordena todos los Edits del formulario, en la forma en que se encontraban
originalmente.
Botn 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
condicin imprime una advertencia diciendo que los elementos de la diagonal principal
deben ser distintos de cero y desactiva los botones Calcular aproximacin y Calcular
paso a pas0. De lo contrario comprueba que la matriz sea dominante, comparando los
elementos de la diagonal con los dems:
Si el valor absoluto de cada elemento de la diagonal es mayor a la suma de los
valores absolutos de los dems elementos de la fila donde se encuentra, imprime un
mensaje diciendo que la matriz es fuertemente dominante.
Si el valor absoluto de uno o ms elementos de la diagonal es igual a la suma de los
valores absolutos de los dems elementos de la fila donde se encuentra, sin que
ninguno sea menor que dicha suma, imprime un mensaje diciendo que la matriz es
dbilmente dominante.
Si no cumple ninguna condicin quiere decir que no es una matriz dominante por lo
que es posible que el mtodo no sea convergente para la matriz en cuestin, por lo
que imprime un mensaje que advierte que no se garantiza la convergencia del
mtodo, y desactiva el botn Calcular aproximacin.
Por ltimo normaliza los coeficientes de las ecuaciones anteriormente mostradas, con los
datos necesarios, dependiendo del orden de la matriz.
Botn Calcular aproximacin:
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: .
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
55
Para matrices de orden 3x3: .
Para matrices de orden 2x2: .
Dentro de una estructura de repeticin 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 recin calculado. Compara los
valores absolutos de los errores con la tolerancia establecida y si todos son menores a sta,
imprime un mensaje sealando que se ha encontrado una aproximacin, sustituye los
nuevos valores en las ecuaciones originales para comprobar los resultados y los imprime, al
igual que los valores recin calculados y el error de cada uno en los Edits correspondientes.
Tambin muestra un mensaje con el nmero de iteraciones realizadas y detiene el proceso.
De no cumplir la condicin: Reasigna valores a las variables, siendo ahora el valor inicial
igual al recin calculado ( ) y aumenta en uno el contador de iteraciones. Reinicia el
proceso.
Botn 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 recin 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 recin calculado. Compara los
valores absolutos de los errores con la tolerancia establecida y si todos son menores a sta,
imprime un mensaje sealando que se ha encontrado una aproximacin. Sustituye los
nuevos valores en las ecuaciones originales para comprobar los resultados.
Reasigna valores a las variables, siendo ahora el valor inicial igual al recin calculado
( ). Imprime los valores recin calculados, sus respectivos errores y el valor de la
ecuacin en funcin de los nuevos valores en los Edits correspondientes. Tambin imprime
un mensaje con el nmero de iteraciones, y aumenta en uno el contador.
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
56
//----------------------------------------------------------------
#include
#pragma hdrstop
#include "Unit1.h"
//----------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
#include
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)
{
}
//----------------------------------------------------------------
//botn 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;
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
57
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;
}
//----------------------------------------------------------------
//botn 3x3
void __fastcall TForm1::Button6Click(TObject *Sender)
{
Image1->Visible=false;
Image38->Visible=true;
Image39->Visible=false;
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
58
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;
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
59
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;
}
//----------------------------------------------------------------
//botn 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;
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
60
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();
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
61
n=4;}
//----------------------------------------------------------------
//botn 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= fabs(a1)+fabs(a2)+fabs(a3);
s2= fabs(b0)+fabs(b2)+fabs(b3);
s3= fabs(c0)+fabs(c1)+fabs(c3);
s4= fabs(d0)+fabs(d1)+fabs(d2);
q1=s1/fabs(a0);
q2=s2/fabs(b1);
q3=s3/fabs(c2);
q4=s4/fabs(d3);
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
62
m=q1+q2+q3+q4;
if(q1Enabled=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();
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
63
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(q1Enabled=true;}
else if(q1Caption="El mtodo 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();
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
64
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(q1Enabled=true;
Button3->Enabled=true;}
else if(q1Enabled=true;}
else{
Label3->Caption="El mtodo 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;
}
//----------------------------------------------------------------
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
65
//botn calcular aproximacin
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(DxText=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;}
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
66
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(DxText=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++;}}
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
67
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(DxText=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;
}
//----------------------------------------------------------------
//botn calcular paso a paso
void __fastcall TForm1::Button3Click(TObject *Sender)
{
if(n==4){
if (k==0){
i=0;
y1=Edit22->Text.ToDouble();
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
68
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(DxText=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();
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
69
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(DxText=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);
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
70
Dy=fabs(dy);
if(DxText=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++;
}
//----------------------------------------------------------------
//botn 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="";
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
71
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;
}
//----------------------------------------------------------
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
72
Este mtodo nos servir para encontrar la solucin a un sistema no lineal es decir de
exponentes diferentes a 1. Para su anlisis se propondr el siguiente sistema:
+
La figura anterior muestra grficamente al sistema de ecuaciones, donde se encuentran una
circunferencia y una hiprbola.
La frmula de recurrencia de este mtodo es la siguiente:
[
( )
( )] ( )
Donde J es el Jacobiano:
[
]
Y lo podemos determinar de la siguiente manera:
| | [ ( )]
6.- Mtodo de Newton: Sistemas de ecuaciones no lineales
Corresponden a
la ecuacin de
una
circunferencia y
de una hiprbola
respectivamente
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
73
La ecuacin (1) tiene analoga con la ecuacin (2) del mtodo de Newton Raphson para
encontrar races de ecuaciones:
( )
( ) ( )
Para encontrar la frmula 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 frmula de la
adjunta, si es una matriz de orden mayor se realizan por mtodos ya conocidos.
Posteriormente se precede a conocer a :
[ ( )] *
+
*
+
[
]
Podemos verificar la inversa haciendo :
[
] [
] *
+
Sabiendo que:
*
+ y *
+
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
74
Ahora sustituimos los valores ya calculados en la frmula (1):
*
+ *
+
[
]
[
+
]
Al realizar las operaciones requeridas obtenemos las frmulas de recurrencia, las cuales
son:
(
+ )
(
) ( )
(
+ ) +
(
) ( )
Reduciendo trminos semejantes tenemos:
+
( )
+
( )
Finalmente las ecuaciones 5 y 6 son nuestras frmulas 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 frmulas para otros sistemas se tiene que realizar el mismo procedimiento,
aplicando la formula (1), hasta obtener las frmulas de recurrencia requeridas para la
solucin del sistema no lineal.
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
75
Programacin:
Interfaz grfica propuesta
Interpretacin por botn
Botn Aproximar solucin:
Lee los valores para y , la tolerancia y el nmero de iteraciones deseadas, las cuales
debern 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 nmero 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 contina el proceso calculando, dentro de una
estructura de repeticin while, y con ayuda de las ecuaciones (5) y (6)
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
76
anteriormente mostradas; calcula el error de cada variable, restando el valor inicial al valor
recin 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 recin calculado es ahora el valor inicial para la
siguiente iteracin y y aumenta en uno el contador de iteraciones. Si ste
llega al lmite 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 funcin de los valores
recin calculados y el nmero de iteraciones realizadas.
Botn Paso a paso:
La primera vez que se presiona el botn lee los valores para y y la tolerancia, si los
valores no cumplen con las condiciones anteriormente mencionadas, muestra un mensaje
sealando que datos es necesario corregir, los borra y posiciona el cursor sobre ellos. De
cumplirse todas las condiciones realizan los clculos de y con ayuda de las
ecuaciones (5) y (6), y calcula el error de cada variable, restando el valor inicial al valor
recin 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 funcin de los valores
recin calculados y el nmero de iteraciones realizadas.
Botn Limpiar valores:
Borra los datos escritos en el formulario y posiciona el puntero en el primer Edit. Reinicia
el valor de la variable auxiliar.
UNIVERSIDAD AUTNOMA DE CHIAPAS FACULTAD DE INGENIERA
77
Cdigo de programacin //--------------------
Recommended