Skip to content

Instantly share code, notes, and snippets.

@Asmilex
Last active January 9, 2021 11:42
Show Gist options
  • Save Asmilex/c631446304cfbc029055d0951a8967cc to your computer and use it in GitHub Desktop.
Save Asmilex/c631446304cfbc029055d0951a8967cc to your computer and use it in GitHub Desktop.
Calculadora para ecuaciones cúbicas y cuárticas
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 98,
"metadata": {},
"outputs": [],
"source": [
"import sympy as sym\n",
"x = sym.Symbol('x')"
]
},
{
"cell_type": "code",
"execution_count": 99,
"metadata": {},
"outputs": [],
"source": [
"n = 4\n",
"\n",
"b = -8\n",
"c = 24\n",
"d = -28\n",
"e = 11\n",
"\n",
"beta = b/n"
]
},
{
"cell_type": "code",
"execution_count": 100,
"metadata": {},
"outputs": [],
"source": [
"def f(x):\n",
" return x**4 + b*x**3 + c*x**2 + d*x + e "
]
},
{
"cell_type": "code",
"execution_count": 101,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"1.0*x**4 + 4.0*x + 3.0"
],
"text/latex": "$\\displaystyle 1.0 x^{4} + 4.0 x + 3.0$"
},
"metadata": {},
"execution_count": 101
}
],
"source": [
"def red_f(x):\n",
" return f(x-beta).simplify()\n",
"red_f(x)"
]
},
{
"cell_type": "code",
"execution_count": 102,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"(0.0, 4.00000000000000, 3.00000000000000)"
]
},
"metadata": {},
"execution_count": 102
}
],
"source": [
"p = sym.poly_from_expr(red_f(x), x)[0].nth(2)\n",
"q = sym.poly_from_expr(red_f(x), x)[0].nth(1)\n",
"r = sym.poly_from_expr(red_f(x), x)[0].nth(0)\n",
"\n",
"p, q, r"
]
},
{
"cell_type": "code",
"execution_count": 103,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Queremos poner el polinomio anterior de la forma \n\tx^4 + px^2 + qx + r = (x^2 + kx + l)(x^2 - kx + m)\n\nPretendemos descomponer, asi que debemos resolver el sistema \n\t-k^2(l + m) = 0.0 \n\tk(m - l) = 4.00000000000000 \n\tlm = 3.00000000000000\n\neste sistema nos dice que \n\tm = (k**3 + pk + q) / (2k) \n\tl = (k**3 + pk - q) / (2k)\n(Nota: cambiar lo que vale p y q a mano donde sea necesario)\n\nPor lo que, sustituyendo, \n\tk**6 + 2pk**4 + (p**2 - 4r)k**2 - q**2 = 0 Así que k**2 es solución de la siguiente ecuación (igualando a 0):\n"
]
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"x**3 - 12.0*x - 16.0"
],
"text/latex": "$\\displaystyle x^{3} - 12.0 x - 16.0$"
},
"metadata": {},
"execution_count": 103
}
],
"source": [
"print(\"Queremos poner el polinomio anterior de la forma \\n\\tx^4 + px^2 + qx + r = (x^2 + kx + l)(x^2 - kx + m)\")\n",
"print(\"\\nPretendemos descomponer, asi que debemos resolver el sistema \\n\\t-k^2(l + m) =\", p, \"\\n\\tk(m - l) =\", q, \"\\n\\tlm =\", r)\n",
"print(\"\\neste sistema nos dice que \\n\\tm = (k**3 + pk + q) / (2k) \\n\\tl = (k**3 + pk - q) / (2k)\\n(Nota: cambiar lo que vale p y q a mano donde sea necesario)\")\n",
"\n",
"print(\"\\nPor lo que, sustituyendo, \\n\\tk**6 + 2pk**4 + (p**2 - 4r)k**2 - q**2 = 0 Así que k**2 es solución de la siguiente ecuación (igualando a 0):\")\n",
"\n",
"def resol_f(x):\n",
" return (x**3 + 2*p*x**2 +(p**2 - 4*r)*x - q**2).simplify()\n",
"\n",
"\n",
"\n",
"resol_f(x)"
]
},
{
"cell_type": "code",
"execution_count": 104,
"metadata": {},
"outputs": [],
"source": [
"# Aplicamos ahora el método de las ecuaciones cúbicas. Si quieres ver la solución con más detalle, ve al archivo llamado Cúbicas.ipynb y pon ahí los coeficientes del anterior polinomio. De todas formas, aquí se da una solución\n",
"\n",
"\n",
"beta_ = sym.poly_from_expr(resol_f(x), x)[0].nth(2)/3"
]
},
{
"cell_type": "code",
"execution_count": 105,
"metadata": {},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"x**3 - 12.0*x - 16.0"
],
"text/latex": "$\\displaystyle x^{3} - 12.0 x - 16.0$"
},
"metadata": {},
"execution_count": 105
}
],
"source": [
"def red_resol_f(x):\n",
" return resol_f(x-beta_).simplify()\n",
"red_resol_f(x)"
]
},
{
"cell_type": "code",
"execution_count": 106,
"metadata": {
"scrolled": true
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Debemos tomar un valor válido para k de forma que k^2 = una raíz de la cúbica anterior. Ve al anterior notebook y busca aquella raíz más cómoda, y pega su resultado en la casilla de abajo\n\nk^2 = raíz \t=>\t k = sqrt(raíz de la cúbica)\n"
]
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"2"
]
},
"metadata": {},
"execution_count": 106
}
],
"source": [
"print(\"Debemos tomar un valor válido para k de forma que k^2 = una raíz de la cúbica anterior. Ve al anterior notebook y busca aquella raíz más cómoda, y pega su resultado en la casilla de abajo\")\n",
"\n",
"print(\"\\nk^2 = raíz \\t=>\\t k = sqrt(raíz de la cúbica)\")\n",
"k = 2\n",
"\n",
"k"
]
},
{
"cell_type": "code",
"execution_count": 107,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Por lo anterior, sabemos que l y m valen lo siguiente:\n"
]
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"(1.00000000000000, 3.00000000000000)"
]
},
"metadata": {},
"execution_count": 107
}
],
"source": [
"print(\"Por lo anterior, sabemos que l y m valen lo siguiente:\")\n",
"m = (k**3 + p*k + q) / (2*k)\n",
"l = (k**3 + p*k - q) / (2*k)\n",
"\n",
"l, m"
]
},
{
"cell_type": "code",
"execution_count": 108,
"metadata": {},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Por tanto, ahora sabemos que el polinomio\n\t 1.0*x**4 + 4.0*x + 3.0 = ( x**2 + 2*x + 1.0 ) * ( x**2 - 2*x + 3.0 )\nSus raíces son \n\t [-1.00000000000000] [1.0 - 1.4142135623731*I, 1.0 + 1.4142135623731*I]\nPor lo que solo queda sacara las raíces de nuestra ecuación original, para lo cual hacemos\n\talpha_i = Beta_i -b/4\nFinalmente estas son las soluciones:\n\n"
]
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"[1.00000000000000, 3.0 - 1.4142135623731*I, 3.0 + 1.4142135623731*I]"
]
},
"metadata": {},
"execution_count": 108
}
],
"source": [
"\n",
"#Ahora podemos declarar los polinomios\n",
"\n",
"def pol_1(x):\n",
" return x**2 + k*x + l\n",
"def pol_2(x):\n",
" return x**2 - k*x + m\n",
"\n",
"print(\"Por tanto, ahora sabemos que el polinomio\\n\\t\", red_f(x), \" = (\", pol_1(x), \") * (\", pol_2(x), \")\")\n",
"\n",
"raices1 = sym.solve(pol_1(x),x)\n",
"raices2 = sym.solve(pol_2(x),x)\n",
"\n",
"print(\"Sus raíces son \\n\\t\", raices1, raices2)\n",
"print(\"Por lo que solo queda sacara las raíces de nuestra ecuación original, para lo cual hacemos\\n\\talpha_i = Beta_i -b/4\\nFinalmente estas son las soluciones:\\n\")\n",
"\n",
"raices\n",
"raices = raices1 \n",
"raices.extend(raices2)\n",
"\n",
"raices = [i - b/4 for i in raices]\n",
"raices"
]
}
],
"metadata": {
"kernelspec": {
"name": "python3",
"display_name": "Python 3.7.0 32-bit",
"metadata": {
"interpreter": {
"hash": "ca88bab9ce8d9e4c3717e0c654e4f59b1c36aef4cbef335c62f6a9b2c686e4f2"
}
}
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.0-final"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Display the source blob
Display the rendered blob
Raw
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment