top of page
Foto del escritorGato Ingeniero

Resolver Ecuaciones NO Lineales

Actualizado: 6 ene 2022

-> Tiene su menú interactivo, es mas de lo que muestra la imagen.

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

-> Presenta 3 métodos para resolver las ecuaciones planteadas.

-> La ecuaciones para los métodos están dentro de sus mismas funciones, separadas entre comentarios: ///ECUACION...//ECUACION

-> Las ecuaciones deben ser declaradas antes de correr el programa.

-> Dado que el programa puede ciclarse se recomienda del mismo modo, si desea, mejorarlo sacando las ecuaciones para trabajarlas como funciones, con el fin de que sea mas cómodo el trabajar dentro.

-> El programa también muestra la evolución de la solución con su respectivo calculo de error.

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;

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

double miabs(double &val)

{

if(val<0)

val=val*(-1);

return val;

}

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

void Secante()

{

double fxa,fx0,xa,x0,h,x1,Tol,E,Es[20],Xs[20];

int j=0;

printf("\n Metodo de la Secante \n");

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

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

printf("\n Introduza el paso h -> "); scanf("%lf",&h);

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

{

xa=(double) x0+h;

///ECUACION

fx0=(double) pow(x0,2) - 2*cos(x0) + 1;

fxa=(double) pow(xa,2) - 2*cos(xa) + 1;


//fx0=(double) (pow(x0,2) * log10(x0))- 10;

//fxa=(double) (pow(xa,2) * log10(xa))- 10;


//fx0=(double) 5 - pow(x0,2) + (5*cos(x0));

//fxa=(double) 5 - pow(xa,2) + (5*cos(xa));

///ECUACION

x1=(double) x0 - (((x0-xa)/(fx0-fxa))*fx0);


E=miabs(fx0);

printf("\n x%d -> %.10lf",i+1,x1);

printf("\n E%d -> %.10lf\n",i+1,E);

x0=x1;

Xs[i]=x1; Es[i]=E;

}

system("PAUSE");

system("cls");

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

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

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

while(Tol<Es[j])

{

printf("\n %d. | %.10lf | %.10lf",j+1,Xs[j],Es[j]);

j++;

}

printf("\n %d. | %.10lf | %.10lf",j+1,Xs[j],Es[j]);

cout<<"\n"<<endl;

system("PAUSE");

}

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

void miabsoluto(double &val)

{

if(val<0)

val=val*(-1);

}

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

void MetFalsaPos()

{

double a,b,x[50],F[50],xn,aux[20],ll[20];

int k=1;

printf("\n *****CODE MADE BY ALEXIS SEGALES***** \n");

printf("\n METODO DE LA FALSA APROXIMACION\n");

printf("\n Coloque el intervalo de existencia: \n");

cout<<"\n a ->> "; cin>>a;

cout<<"\n b ->> "; cin>>b;

cout<<"\n";

system("cls");

///Se define la ecuacion con la cual trabajar

printf("\n *****Code made by ALEXIS SEGALES***** \n");

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

{

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

x[0]=a; x[1]=b;

printf(" a = %.7f\n",a);

printf(" b = %.7f\n\n",b);

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

{

///ECUACION

F[i]=(float) pow(10,x[i]) + pow(x[i],3) + 2;

printf(" F[%d] = %.10lf\n",i+1,F[i]);

}

xn=(float) ((a*F[1])-(b*F[0]))/(F[1]-F[0]);

printf("\n xn = %.10lf\n",xn);

///ECUACION

F[2]=(float) pow(10,xn) + pow(xn,3) + 2;

///ECUACION

printf(" F[xn] = %.10lf \n",F[2]);

miabsoluto(F[2]);

printf(" E = %.10lf \n\n",F[2]);

if(F[2]>0 && F[0]>0)

a=xn;

if(F[2]>0 && F[1]>0)

b=xn;

if(F[2]<0 && F[0]<0)

a=xn;

if(F[2]<0 && F[1]<0)

b=xn;

aux[j]=xn;

ll[j]=F[2];

}

system("PAUSE");

system("cls");

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

printf("\n n x E");

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

printf("\n 1 | %.10lf | %.10lf",aux[0],ll[0]);

do

{

printf("\n %d | %.10lf | %.10lf",k+1,aux[k],ll[k]);

k++;

}while(aux[k-1] != aux[k]);

cout<<"\n";

system("PAUSE");

}

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

void valec(double val,double &fx)

{

//fx=(double) pow(e,-cos(val)) + sin(val) - log(val) - val;

//fx=(double) pow(e,val) + pow(val,2) + (5*val) - 20;

fx=(double) log(2 + pow(val,2)) - val;

}

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

void abc(double &a,double &b,double &c,double xn,double xn1,double xn2,double fx,double fx1,double fx2)

{

a=(double) (((xn-xn2)*(fx-fx1))-((xn-xn1)*(fx-fx2))) / ((xn-xn1)*(xn-xn2)*(xn1-xn2));

b=(double) ((pow((xn-xn2),2)*(fx-fx1))-(pow((xn-xn1),2)*(fx-fx2))) / ((xn-xn1)*(xn-xn2)*(xn1-xn2));

c=(double) fx;

}

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

void MetMuller()

{

double fx,fx1,fx2,x0,xn,xn1,xn2,h,Tol,a,b,c,niu,lambda,delta,xf[20],E[20];

int i=0,j=0;

printf("\n Metodo de Muller \n");

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

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

printf("\n Introduza el paso h -> "); scanf("%lf",&h);

xn=x0;

xn1=x0-h;

xn2=x0-(2*h);

system("cls");

do

{

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

valec(xn,fx);

valec(xn1,fx1);

valec(xn2,fx2);


printf("\n xn = %.9lf fxn = %.10lf \n xn1 = %.9lf fxn1 = %.10lf \n xn2 = %.9lf fxn2 = %.10lf \n",xn,fx,xn1,fx1,xn2,fx2);


abc(a,b,c,xn,xn1,xn2,fx,fx1,fx2);

printf("\n a = %.10lf \n b = %.10lf \n c = %.10lf \n",a,b,c);


niu=(double) a/b;

lambda=(double) c/b;

delta=(double) sqrt(1-(4*niu*lambda));


xf[i]=(double) xn - (2*lambda/(1+delta));

E[i]=(double) miabs(c);


printf("\n x[%d] = %.10lf \n E[%d] = %.10lf \n",i+1,xf[i],i+1,E[i]);

xn=xf[i];

xn1=x0;

xn2=x0-h;

i++;

}while(E[i-1]>Tol);

system("PAUSE");

system("cls");

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

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

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

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

while(Tol < E[j])

{

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

j++;

}

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

cout<<"\n"<<endl;

system("PAUSE");

}

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

void menu()

{

int val,vs;

printf("\n *****CODES FOR SOLVING NO LINEAR ECUATIONS BY ALEXIS SEGALES*****\n");

printf("\n Escoja el metodo para resolver su ecuacion: \n");

printf("\n 1) Metodo de La Falsa Posicion\n");

printf("\n 2) Metodo de Muller\n");

printf("\n 3) Metodo de La Secante\n");

printf("\n -> ");

cin>>val;

if(val==1)

{

system("cls");

MetFalsaPos();

}

if(val==2)

{

system("cls");

MetMuller();

}

if(val==3)

{

system("cls");

Secante();

}

printf("\n Desea realizar otra operacion? \n");

printf("\n 1) SI ");

printf("\n 2) NO ");

cin>>vs;

if(vs==1)

{

system("cls");

menu();

}

if(vs==2)

{

system("PAUSE");

}

}

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

int main()

{

menu();

return 0;

}


8 visualizaciones0 comentarios

Entradas recientes

Ver todo

Commentaires


Publicar: Blog2_Post
bottom of page