#include <iostream>
#include <fstream>
#include <cmath>
double analitica(double x) {
// Corregir la expresión para evitar divisiones enteras
double y = -1 / ((x * x / 4 + 0.5 * x - 1));
return y;
}
double d_f(double x, double y) {
return 0.5 * (1 + x) * pow(y, 2);
}
double d_2_f(double x, double y) {
return 0.5 * pow(y, 2) + (1 + x) * y * d_f(x, y);
}
double d_3_f(double x, double y) {
return 2 * y * d_f(x, y) + (1 + x) * pow(d_f(x, y), 2) + (1 + x) * y * d_2_f(x, y);
}
double sol_taylor(double x0, double y0, double h) {
double y_i;
y_i = y0 + h * d_f(x0, y0) + 0.5 * pow(h, 2) * d_2_f(x0, y0) + (1.0 / 6) * pow(h, 3) * d_3_f(x0, y0);
return y_i;
}
int main() {
double x0 = 0.0, y0 = -1.0; // Condiciones iniciales
double h_values[] = {0.01, 0.001}; // Valores de h
int n = sizeof(h_values) / sizeof(h_values[0]);
std::ofstream file("soluciones.txt"); // Archivo para almacenar resultados
for (int i = 0; i < n; ++i) {
double h = h_values[i];
int num_steps = static_cast<int>(1.0 / h); // Número de pasos
double x = x0, y = y0;
file << "h = " << h << "\n";
file << "x\ty\tSol. Analitica\n";
for (int j = 0; j <= num_steps; ++j) {
file << x << "\t" << y << "\t" << analitica(x) << "\n";
y = sol_taylor(x, y, h);
x += h;
}
file << "\n";
}
file.close();
// Script para graficar
std::ofstream script("grafica.gp");
script << "set term png\n";
script << "set output 'grafica.png'\n";
script << "set xlabel 'x'\n";
script << "set ylabel 'y'\n";
script << "set title 'Solución de EDO con Método de Taylor'\n";
script << "plot 'soluciones.txt' using 1:2 with lines title 'h=0.01',\\\n";
script << " 'soluciones.txt' using 1:3 with lines title 'Sol. Analitica',\\\n";
script << " 'soluciones.txt' using 1:2 with points title 'Datos h=0.01'\n";
script << "replot 'soluciones.txt' using 1:4 with lines title 'h=0.001',\\\n";
script << " 'soluciones.txt' using 1:3 with lines title 'Sol. Analitica',\\\n";
script << " 'soluciones.txt' using 1:4 with points title 'Datos h=0.001'\n";
script << "set key bottom right\n";
script << "set grid\n";
script << "set style fill transparent solid 0.5 noborder\n";
script << "set object 1 rect from graph 0,0 to graph 1,1 behind fc rgb 'rainbow' \n";
script << "set label 1 'Fisica computacional 1, autor Jorge Garzón' at graph 0.5, graph 0.1 center front\n";
script << "set tics out\n";
script << "replot\n";
script.close();
// Ejecutar gnuplot
system("gnuplot grafica.gp");
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnN0cmVhbT4KI2luY2x1ZGUgPGNtYXRoPgoKZG91YmxlIGFuYWxpdGljYShkb3VibGUgeCkgewogICAgLy8gQ29ycmVnaXIgbGEgZXhwcmVzacOzbiBwYXJhIGV2aXRhciBkaXZpc2lvbmVzIGVudGVyYXMKICAgIGRvdWJsZSB5ID0gLTEgLyAoKHggKiB4IC8gNCArIDAuNSAqIHggLSAxKSk7CiAgICByZXR1cm4geTsKfQoKZG91YmxlIGRfZihkb3VibGUgeCwgZG91YmxlIHkpIHsKICAgIHJldHVybiAwLjUgKiAoMSArIHgpICogcG93KHksIDIpOwp9Cgpkb3VibGUgZF8yX2YoZG91YmxlIHgsIGRvdWJsZSB5KSB7CiAgICByZXR1cm4gMC41ICogcG93KHksIDIpICsgKDEgKyB4KSAqIHkgKiBkX2YoeCwgeSk7Cn0KCmRvdWJsZSBkXzNfZihkb3VibGUgeCwgZG91YmxlIHkpIHsKICAgIHJldHVybiAyICogeSAqIGRfZih4LCB5KSArICgxICsgeCkgKiBwb3coZF9mKHgsIHkpLCAyKSArICgxICsgeCkgKiB5ICogZF8yX2YoeCwgeSk7Cn0KCmRvdWJsZSBzb2xfdGF5bG9yKGRvdWJsZSB4MCwgZG91YmxlIHkwLCBkb3VibGUgaCkgewogICAgZG91YmxlIHlfaTsKICAgIHlfaSA9IHkwICsgaCAqIGRfZih4MCwgeTApICsgMC41ICogcG93KGgsIDIpICogZF8yX2YoeDAsIHkwKSArICgxLjAgLyA2KSAqIHBvdyhoLCAzKSAqIGRfM19mKHgwLCB5MCk7CiAgICByZXR1cm4geV9pOwp9CgppbnQgbWFpbigpIHsKICAgIGRvdWJsZSB4MCA9IDAuMCwgeTAgPSAtMS4wOyAvLyBDb25kaWNpb25lcyBpbmljaWFsZXMKICAgIGRvdWJsZSBoX3ZhbHVlc1tdID0gezAuMDEsIDAuMDAxfTsgLy8gVmFsb3JlcyBkZSBoCiAgICBpbnQgbiA9IHNpemVvZihoX3ZhbHVlcykgLyBzaXplb2YoaF92YWx1ZXNbMF0pOwoKICAgIHN0ZDo6b2ZzdHJlYW0gZmlsZSgic29sdWNpb25lcy50eHQiKTsgLy8gQXJjaGl2byBwYXJhIGFsbWFjZW5hciByZXN1bHRhZG9zCgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICBkb3VibGUgaCA9IGhfdmFsdWVzW2ldOwogICAgICAgIGludCBudW1fc3RlcHMgPSBzdGF0aWNfY2FzdDxpbnQ+KDEuMCAvIGgpOyAvLyBOw7ptZXJvIGRlIHBhc29zCiAgICAgICAgZG91YmxlIHggPSB4MCwgeSA9IHkwOwoKICAgICAgICBmaWxlIDw8ICJoID0gIiA8PCBoIDw8ICJcbiI7CiAgICAgICAgZmlsZSA8PCAieFx0eVx0U29sLiBBbmFsaXRpY2FcbiI7CgogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDw9IG51bV9zdGVwczsgKytqKSB7CiAgICAgICAgICAgIGZpbGUgPDwgeCA8PCAiXHQiIDw8IHkgPDwgIlx0IiA8PCBhbmFsaXRpY2EoeCkgPDwgIlxuIjsKICAgICAgICAgICAgeSA9IHNvbF90YXlsb3IoeCwgeSwgaCk7CiAgICAgICAgICAgIHggKz0gaDsKICAgICAgICB9CiAgICAgICAgZmlsZSA8PCAiXG4iOwogICAgfQogICAgZmlsZS5jbG9zZSgpOwoKICAgIC8vIFNjcmlwdCBwYXJhIGdyYWZpY2FyCiAgICBzdGQ6Om9mc3RyZWFtIHNjcmlwdCgiZ3JhZmljYS5ncCIpOwogICAgc2NyaXB0IDw8ICJzZXQgdGVybSBwbmdcbiI7CiAgICBzY3JpcHQgPDwgInNldCBvdXRwdXQgJ2dyYWZpY2EucG5nJ1xuIjsKICAgIHNjcmlwdCA8PCAic2V0IHhsYWJlbCAneCdcbiI7CiAgICBzY3JpcHQgPDwgInNldCB5bGFiZWwgJ3knXG4iOwogICAgc2NyaXB0IDw8ICJzZXQgdGl0bGUgJ1NvbHVjacOzbiBkZSBFRE8gY29uIE3DqXRvZG8gZGUgVGF5bG9yJ1xuIjsKICAgIHNjcmlwdCA8PCAicGxvdCAnc29sdWNpb25lcy50eHQnIHVzaW5nIDE6MiB3aXRoIGxpbmVzIHRpdGxlICdoPTAuMDEnLFxcXG4iOwogICAgc2NyaXB0IDw8ICIgICAgICdzb2x1Y2lvbmVzLnR4dCcgdXNpbmcgMTozIHdpdGggbGluZXMgdGl0bGUgJ1NvbC4gQW5hbGl0aWNhJyxcXFxuIjsKICAgIHNjcmlwdCA8PCAiICAgICAnc29sdWNpb25lcy50eHQnIHVzaW5nIDE6MiB3aXRoIHBvaW50cyB0aXRsZSAnRGF0b3MgaD0wLjAxJ1xuIjsKICAgIHNjcmlwdCA8PCAicmVwbG90ICdzb2x1Y2lvbmVzLnR4dCcgdXNpbmcgMTo0IHdpdGggbGluZXMgdGl0bGUgJ2g9MC4wMDEnLFxcXG4iOwogICAgc2NyaXB0IDw8ICIgICAgICdzb2x1Y2lvbmVzLnR4dCcgdXNpbmcgMTozIHdpdGggbGluZXMgdGl0bGUgJ1NvbC4gQW5hbGl0aWNhJyxcXFxuIjsKICAgIHNjcmlwdCA8PCAiICAgICAnc29sdWNpb25lcy50eHQnIHVzaW5nIDE6NCB3aXRoIHBvaW50cyB0aXRsZSAnRGF0b3MgaD0wLjAwMSdcbiI7CiAgICBzY3JpcHQgPDwgInNldCBrZXkgYm90dG9tIHJpZ2h0XG4iOwogICAgc2NyaXB0IDw8ICJzZXQgZ3JpZFxuIjsKICAgIHNjcmlwdCA8PCAic2V0IHN0eWxlIGZpbGwgdHJhbnNwYXJlbnQgc29saWQgMC41IG5vYm9yZGVyXG4iOwogICAgc2NyaXB0IDw8ICJzZXQgb2JqZWN0IDEgcmVjdCBmcm9tIGdyYXBoIDAsMCB0byBncmFwaCAxLDEgYmVoaW5kIGZjIHJnYiAncmFpbmJvdycgXG4iOwogICAgc2NyaXB0IDw8ICJzZXQgbGFiZWwgMSAnRmlzaWNhIGNvbXB1dGFjaW9uYWwgMSwgYXV0b3IgSm9yZ2UgR2FyesOzbicgYXQgZ3JhcGggMC41LCBncmFwaCAwLjEgY2VudGVyIGZyb250XG4iOwogICAgc2NyaXB0IDw8ICJzZXQgdGljcyBvdXRcbiI7CiAgICBzY3JpcHQgPDwgInJlcGxvdFxuIjsKICAgIHNjcmlwdC5jbG9zZSgpOwoKICAgIC8vIEVqZWN1dGFyIGdudXBsb3QKICAgIHN5c3RlbSgiZ251cGxvdCBncmFmaWNhLmdwIik7CgogICAgcmV0dXJuIDA7Cn0K