top of page
Foto del escritorGato Ingeniero

Resolver Sistemas NO Lineales de Ecuaciones

Actualizado: 6 ene 2022

-> Mantiene una precisión comprobada de 9 decimas.

-> Presenta 1 métodos para resolver el sistema planteado, el método de Newton-Rhapson.

-> Las ecuaciones y derivadas se trabajan en funciones independientes.

-> Las ecuaciones y derivadas deben ser escritas antes de correr el programa.

-> Hay una variante dentro del código mejorable, el trabajo con matrices como escalonamiento. En el código de Resolver Ecuaciones Diferenciales esta la variante superior que permite trabajar un determinante n*n

-> El programa también muestra una solución detallada con las matrices cambiadas.

-> El programa presenta al final una tabla de valores y su error durante sus iteraciones.

-> Hará cuantas iteraciones sean necesarias para obtener un error menor a 0.000000000



Acá les dejo el código:


#include <iostream>

#include <stdio.h>

#include <math.h>

#include <stdlib.h>

using namespace std;

double pi=3.14159265358979;

double e=2.718281828459045;

///---------------------------------------------------------------------

struct Matriz

{

double m[2][2];

};

struct Vect

{

double v[10];

};

struct Cadena

{

double x[10],y[10];

};

///---------------------------------------------------------------------

void Identidad(int lm , Matriz &a)

{

for(int i=0 ; i<lm ; i++)

{

for(int j=0 ; j<lm ; j++)

{

if(i==j)

a.m[i][j]=1;

else

a.m[i][j]=0;

}

}

}

///---------------------------------------------------------------------

double miabs(double &val)

{

if(val<0)

val=val*(-1);

return val;

}

///---------------------------------------------------------------------

void derivadas(double &f1x, double &f2x, double &f1y, double &f2y, double x, double y) //x0 = 1; y0 = 1 ; Tol=0.0000

{

f1x=(double) -3 * pow((x-1),2); f1y=(double) 2*y;

f2x=(double) -pow(e,-x) - 3; f2y=(double) ((2*y) / (1+(y*y))) + 2;

}

///---------------------------------------------------------------------

void ecuaciones(double &f1, double &f2, double x, double y)

{

//f1=(double) pow((x+2),2) + (4*y*y) - 4;

//f2=(double) (4*x*x) - pow((y-1),2) - 4;


f1=(double) pow(y,2) - pow((x-1),3);

f2=(double) log(1+pow(y,2)) + pow(e,-x) - (3*x) + (2*y);

}

///---------------------------------------------------------------------

void vm(Matriz &res)

{

printf("\n\n\n\n");

for(int i=0 ; i<2 ; i++)

{

for(int j=0 ; j<2 ; j++)

{

printf(" %.7f ",res.m[i][j]);

}

cout<<endl;

}

}

///---------------------------------------------------------------------

void inversa(Matriz &c,Matriz &ide)

{

double vali=c.m[0][0],vali2=c.m[1][0];

for(int i=0 ; i<2 ; i++)

{

c.m[0][i]=(double) c.m[0][i]/vali;

ide.m[0][i]=(double) ide.m[0][i]/vali;


c.m[1][i]=(double) c.m[1][i]/vali2;

ide.m[1][i]=(double) ide.m[1][i]/vali2;

}

for(int i=0 ; i<2 ; i++)

{

c.m[1][i]=(double) c.m[1][i]+(-1*c.m[0][i]);

ide.m[1][i]=(double) ide.m[1][i]+(-1*ide.m[0][i]);

}

double vali3=c.m[1][1];

for(int i=0 ; i<2 ; i++)

{

c.m[1][i]=(double) c.m[1][i]/vali3;

ide.m[1][i]=(double) ide.m[1][i]/vali3;

}

double vali4=c.m[0][1];

for(int i=0 ; i<2 ; i++)

{

c.m[0][i]=(double) c.m[0][i]-(c.m[1][i]*vali4);

ide.m[0][i]=(double) ide.m[0][i]-(ide.m[1][i]*vali4);

}

}

///---------------------------------------------------------------------

void inversa2(Matriz &num,Matriz &ide)

{

double vali = num.m[0][0];

for(int i=0 ; i<2 ; i++)

{

num.m[0][i]=(double) num.m[0][i] / vali;

ide.m[0][i]=(double) ide.m[0][i] / vali;

}

double vali2 = -num.m[1][0];

for(int j=0 ; j<2 ; j++)

{

num.m[1][j]=(double) num.m[1][j] + (vali2*num.m[0][j]);

ide.m[1][j]=(double) ide.m[1][j] + (vali2*ide.m[0][j]);

}

double vali3 = num.m[1][1];

for(int k=0 ; k<2 ; k++)

{

num.m[1][k]=(double) num.m[1][k] / vali3;

ide.m[1][k]=(double) ide.m[1][k] / vali3;

}

double vali4 = -num.m[0][1];

for(int l=0 ; l<2 ; l++)

{

num.m[0][l]=(double) num.m[0][l] + (vali4*num.m[1][l]);

ide.m[0][l]=(double) ide.m[0][l] + (vali4*ide.m[1][l]);

}

}

///---------------------------------------------------------------------

void matxvect(Matriz &res, Vect &fs)

{

double aux0=fs.v[0],aux1=fs.v[1];

fs.v[0]=(double) (res.m[0][0]*aux0)+(res.m[0][1]*aux1);

fs.v[1]=(double) (res.m[1][0]*aux0)+(res.m[1][1]*aux1);

}

///---------------------------------------------------------------------

void vectxvect(Vect &inis, Vect &fs)

{

fs.v[0]=(double) inis.v[0]-fs.v[0];

fs.v[1]=(double) inis.v[1]-fs.v[1];

}

///---------------------------------------------------------------------

void MetNewRap()

{

int des,j=0,i=0;

Matriz coef;

Matriz ident;

Matriz respaldo;

Vect iniciales;

Vect efes;

Vect E;

Cadena aux;

Cadena xsys;

Identidad(2,ident);

Identidad(2,respaldo);

double Tol,x0,y0,f1,f2,f1x,f2x,f1y,f2y,a,b,c,d,a1,a2;


printf("\n Metodo de Newton Rhapson \n");

printf("\n Introduzca la Toleracia -> "); scanf("%lf",&Tol);

printf("\n Introduza valor x0 -> "); scanf("%lf",&x0);

printf("\n Introduza valor y0 -> "); scanf("%lf",&y0);


derivadas(f1x,f2x,f1y,f2y,x0,y0);

ecuaciones(f1,f2,x0,y0);


a=f1x; b=f1y;

c=f2x; d=f2y;

printf("\n La Matriz Jacobiana del sistema es: ");

printf("\n |%.6f %.6f| \n |%.6f %.6f|",miabs(a),miabs(b),miabs(c),miabs(d));

printf("\n\n Se debe de Reorganizar?\n 1. SI (Si A[0][0] = 0)\n 2. NO");

printf("\n -> "); cin>>des;


if(des==1)

{

printf("\n La Matriz Jacobiana reorganizada del sistema es: ");

printf("\n |%.6f %.6f| \n |%.6f %.6f|\n\n",miabs(c),miabs(d),miabs(a),miabs(b));

printf("\n Luego: \n");

printf("\n |x| = |x0| - |f2x f2y|^(-1) |f2|");

printf("\n |y| = |y0| |f1x f1y| |f1|\n\n");

system("PAUSE");

system("cls");


do

{

coef.m[0][0]=f2x; coef.m[0][1]=f2y;

coef.m[1][0]=f1x; coef.m[1][1]=f1y;

printf("\n %d. ITERACION\n",i+1);


printf("\n |x| = |%.6f| - |%.10f %.10f|^(-1) |%.10f|",x0,f2x,f2y,f2);

printf("\n |y| = |%.6f| |%.10f %.10f| |%.10f|\n",y0,f1x,f1y,f1);


inversa2(coef,ident);

printf("\n |x| = |%.6f| - |%.10f %.10f| |%.10f|",x0,ident.m[0][0],ident.m[0][1],f2);

printf("\n |y| = |%.6f| |%.10f %.10f| |%.10f|",y0,ident.m[1][0],ident.m[1][1],f1);


iniciales.v[0]=x0; efes.v[0]=f2;

iniciales.v[1]=y0; efes.v[1]=f1;


matxvect(ident,efes);

ident=respaldo;

vectxvect(iniciales,efes);


printf("\n\n RESULTADOS");

printf("\n |x| = %.10lf",efes.v[0]);

printf("\n |y| = %.10lf",efes.v[1]);


xsys.x[i]=efes.v[0];

xsys.y[i]=efes.v[1];


ecuaciones(a1,a2,xsys.x[i],xsys.y[i]);


E.v[i]=(float) miabs(a1) + miabs(a2);

printf("\n |E| = %.10lf\n",E.v[i]);


x0=xsys.x[i];

y0=xsys.y[i];

derivadas(f1x,f2x,f1y,f2y,x0,y0);

ecuaciones(f1,f2,x0,y0);

i++;

}while(Tol<E.v[i-1]);


system("PAUSE");

system("cls");

printf("\n TABLA DE RESULTADOS\n");

printf(" -------------------------------------------------");

printf("\n n x y E\n");

printf(" -------------------------------------------------");

while(E.v[j]> Tol)

{

printf("\n %d. | %.10lf | %.10lf | %.10lf",j+1,xsys.x[j],xsys.y[j],E.v[j]);

j++;

}

printf("\n %d. | %.10lf | %.10lf | %.10lf",j+1,xsys.x[j],xsys.y[j],E.v[j]);

cout<<"\n"<<endl;

system("PAUSE");

}


if(des==2)

{

printf("\n Luego: \n");

printf("\n |x| = |x0| - |f1x f1y|^(-1) |f1|");

printf("\n |y| = |y0| |f2x f2y| |f2|\n\n");

system("PAUSE");

system("cls");


do

{

coef.m[0][0]=f1x; coef.m[0][1]=f1y;

coef.m[1][0]=f2x; coef.m[1][1]=f2y;

printf("\n %d. ITERACION\n",i+1);


printf("\n |x| = |%.6f| - |%.10f %.10f|^(-1) |%.10f|",x0,f1x,f1y,f1);

printf("\n |y| = |%.6f| |%.10f %.10f| |%.10f|\n",y0,f2x,f2y,f2);


inversa(coef,ident);

printf("\n |x| = |%.6f| - |%.10f %.10f| |%.10f|",x0,ident.m[0][0],ident.m[0][1],f1);

printf("\n |y| = |%.6f| |%.10f %.10f| |%.10f|",y0,ident.m[1][0],ident.m[1][1],f2);


iniciales.v[0]=x0; efes.v[0]=f1;

iniciales.v[1]=y0; efes.v[1]=f2;



matxvect(ident,efes);

ident=respaldo;

vectxvect(iniciales,efes);


printf("\n\n RESULTADOS");

printf("\n |x| = %.10lf",efes.v[0]);

printf("\n |y| = %.10lf",efes.v[1]);


xsys.x[i]=efes.v[0];

xsys.y[i]=efes.v[1];


ecuaciones(a1,a2,xsys.x[i],xsys.y[i]);


E.v[i]=(float) miabs(a1) + miabs(a2);

printf("\n |E| = %.10lf\n",E.v[i]);


x0=xsys.x[i];

y0=xsys.y[i];

derivadas(f1x,f2x,f1y,f2y,x0,y0);

ecuaciones(f1,f2,x0,y0);

i++;

}while(Tol<E.v[i-1]);


system("PAUSE");

system("cls");

printf("\n TABLA DE RESULTADOS\n");

printf(" -------------------------------------------------");

printf("\n n x y E\n");

printf(" -------------------------------------------------");

while(E.v[j]> Tol)

{

printf("\n %d. | %.10lf | %.10lf | %.10lf",j+1,xsys.x[j],xsys.y[j],E.v[j]);

j++;

}

printf("\n %d. | %.10lf | %.10lf | %.10lf",j+1,xsys.x[j],xsys.y[j],E.v[j]);

cout<<"\n"<<endl;

system("PAUSE");

}

}

///---------------------------------------------------------------------

int main()

{

MetNewRap();

return 0;

}


11 visualizaciones0 comentarios

Entradas recientes

Ver todo

Commentaires


Publicar: Blog2_Post
bottom of page