Está en la página 1de 10

Universidad de Panamá

Facultad de ciencias exactas

Alumno:
Bryan Javier Torres Mendoza

Cédula
EC-106-185

Profesor:
Gustavo Jesús Bracho Rodríguez

Materia:
Física computacional

20 de junio de 2022
Gráfica de la función dada

157570.1 66423080 12438000000 862194900000


ln(𝜎𝑠𝑓 ) = −139.34411 + − + − 𝐸𝑐. 1
𝑇𝑎 𝑇𝑎2 𝑇𝑎3 𝑇𝑎4

Sin embargo, podríamos plantear una nueva función que nos permita hacer una gráfica donde los
interceptos con el eje de las abscisas son los valores de 𝑇𝑎 correspondientes a cada valor de 𝜎𝑠𝑓
157570.1 66423080 12438000000 862194900000
𝑔 = −ln (𝜎𝑠𝑓 ) − 139.34411 + − + −
𝑇𝑎 𝑇𝑎2 𝑇𝑎3 𝑇𝑎4
A continuación, se mostrarán las gráficas para distintos valores de 𝜎𝑠𝑓 .
Para 𝝈𝒔𝒇 = 𝟓
Para 𝝈𝒔𝒇 = 𝟏𝟎
Para 𝝈𝒔𝒇 = 𝟑𝟎

Nota: utilicé esta forma del Método de Steffensen


Código fuente

/* Este programa calcula los valores de la temperatura, en grados


celsius, que corresponden a distintos valores de la saturación de
oxígeno presente en agua dulce. Para esto se desplega un menú
donde el usuario podrá elegir entre 3 métodos distintos de
resolución de ecuaciones no lineales.*/

#include <iostream>
#include <iomanip>
#include "conio.h"
#include <cmath>
#include <ctime>
#include "stdlib.h"
#include <stdio.h>
#include <limits>
#include <string>
#include <windows.h>
#include <locale.h>
#include "locale.h"
#include <math.h>
#include <fstream>
using namespace std;

/*
Definición de las varibales más relevantes

x0: estimación inicial de la raíz en kelvin


x: estimación final de la raíz en kelvin
sig: saturación de sal
Ta: tempertura en grados Kelvin
imax: cantidad máxima de iteraciones
tol: tolerancia
*/

//////////////////////////////////////////////////////////////Función
double inline funcion(double Ta, double sig)
{
return -logl(sig) - 139.34411+(157570.1/Ta)
- (66423080/pow(Ta,2)) + (12438000000/pow(Ta,3))
- (862194900000/pow(Ta,4));
}

///////////////////////////////////////Primera derivada de la función


double inline derivada(double Ta)
{
return (-157570.1/pow(Ta,2)) + (2*66423080/pow(Ta,3))
- (3*12438000000/pow(Ta,4)) + (4*862194900000/pow(Ta,5));
}
///////////////////////////////////////Segunda derivada de la función
double inline segunda_derivada(double Ta)
{
return (2*157570.1/pow(Ta,3)) - (6*66423080/pow(Ta,4))
+ (12*12438000000/pow(Ta,5))
- (20*862194900000/pow(Ta,6));
}

/////////////////////////////////Cálculo del método de Newton Raphson


double metodoNewtonRaphson(double x0,double sig,int imax,double tol)
{
double x, ex = tol / 10.0;
int i = 1;

while(i < imax)


{
x = x0 - funcion(x0, sig) / derivada(x0);

if(fabs(x - x0) < tol)


{
goto II;
}
if(fabs(funcion(x0, sig)) < ex)
{
goto II;
}
x0 = x;
i++;
}

II: cout << "\nEl número de iteraciones realizadas es: " << i <<endl;
cout << "La temperatura en kelvin por Newton-Raphson es: ";
cout << x;
cout << "\nLa temperatura en celsius por Newton-Raphson es: ";
cout << x - 273.15;
}
/////////////////////////////////////Cálculo del método de Steffensen
double MetodoSteffensen(double x0, double sig, int imax, double tol)
{
double x, numerador, denominador, x1, x2;
int i = 1;

while(i < imax)


{
x1 = funcion(x0, sig); //Función evaluada en estimación
x2 = funcion(x0 + x1, sig); //Función evaluada en x1
x = x0 - (pow(x1, 2) / (x2 - x1));

if(fabs(x - x0) < tol)


{
goto II;
}
if(fabs(funcion(x0, sig)) < tol / 10.0)
{
goto II;
}
x0 = x;
i++;
}

II: cout << "\nEl número de iteraciones realizadas es: " << i << endl;
cout << "La temperatura en kelvin por Steffensen es: ";
cout << x;
cout << "\nLa temperatura en celsius por Steffensen es: ";
cout << x - 273.15;
}

//////////////////////////////////////////Cálculo del método de MAbbs


double MAbbs(double x0, double sig, int imax, double tol)
{
double x, f0, g0, h0, f1;
int i = 1;

do
{
f0 = funcion(x0, sig); //Función evaluada en x0
g0 = derivada(x0); // Derivada primera en x0
h0 = segunda_derivada(x0); // Derivada segunda en x0

if (f0 == 0.00 || g0 == 0.00)


{
cout << "Error matemático";
exit (0);
}

x = x0 - f0/g0 - (pow(f0, 2)*h0)/(2*pow(g0, 3))


- (pow(f0, 3)*pow(h0, 2))/(2*pow(g0, 5));

x0 = x;
i++;

if(i>imax)
{
cout << "No se ha encontrado una raíz. ";
exit (0);
}

f1 = funcion(x, sig);
}
while(fabs(f1) > tol);
cout << "\nEl número de iteraciones realizadas es: " << i - 1;
cout << "\nLa temperatura en kelvin por MAbbs es: ";
cout << x;
cout << "\nLa temperatura en celsius por MAbbs es: ";
cout << x - 273.15;
}
////////////////////////////////////////////////////Función principal
int main()
{
double x0, sig, tol, x_actual, x_nuevo;
int imax, eleccion;
char option;
setlocale(LC_CTYPE,"Spanish");
cout.precision(6);
cout.setf(ios::fixed);
system("color F1");

IV: system("cls"); //Presentación del menú


cout << "Buscardor de raices de ecuaciones no lineales"
<< endl << endl;
cout << "1) Newton-Raphson\n2) Steffensen\n3) MAbbs";
cout << endl
<< "\nIntroduzca el número del método que desea utilizar: ";
cin >> eleccion;

if (eleccion == 1)
{
metodoNewtonRaphson(x0, sig, imax, tol);
}
else if (eleccion == 2)
{
MetodoSteffensen(x0, sig, imax, tol);
}
else if (eleccion == 3)
{
MAbbs(x0, sig, imax, tol);
}
else
{
cout << "\nDebe introducir un número que sea 1, 2 o 3\n";
system("pause");
goto IV;
}

III:system("cls"); //Petición de los datos al usuario


cout<<"Introduzca el valor de la saturación en mg/L: "; cin >> sig;
cout<<"Introduzca la tolerancia: "; cin >> tol;
cout<<"Introduzca la cantidad máxima de iteraciones: ";cin>>imax;
cout<<"Introduzca la estimación inicial en K: "; cin >> x0;

if (sig <= 0 || tol <= 0 || imax < 1)


{
cout<<"\nEl valor de la saturación y de la tolarancia debe ser";
cout<<"\nun real positivo, y el valor de la cantidad";
cout<<"\nEl máximo de iteraciones debe ser un entero positivo";
cout<<"\n\n";
system("pause");
goto III;
}
// Generación de la recurrencia
cout << endl << "\nDesea volver a realizar cálculos? (S/N): ";
cin >> option;
switch(option)
{
case 'S':
case 's':
goto IV;
break;
case 'N':
case 'n':
goto V;
break;
}

V: cout << "\nPrograma finalizado";


return 0;
}

También podría gustarte