import matplotlib.pyplot as plt
def secante_tabla(fx, xa, tolerancia):
dx = 4 * tolerancia
xb = xa + dx
tramo = dx
tabla = []
while (tramo >= tolerancia):
fa = fx(xa)
fb = fx(xb)
xc = xa - fa * (xb - xa) / (fb - fa)
tramo = abs(xc - xa)
tabla.append([xa, xb, xc, tramo])
xb = xa
xa = xc
return tabla
a = 3.592
b = 0.04267
# L atm/mol k
R = 0.082054
p = 10
xa = 1.5
tolerancia = 0.001
tramos = 100
# Temperatura predefinida
T = 300 # Cambia este valor según la temperatura deseada
fx = lambda x: (p + a / x**2) * (x - b) - R * T
dfx = lambda x: p - (a / x**2) + (2 * a * b / x**3)
tabla = secante_tabla(fx, xa, tolerancia)
n = len(tabla)
raiz = tabla[n - 1][2]
print('Raíz encontrada:', raiz)
# Visualización gráfica
xi = [a + i * (b - a) / tramos for i in range(tramos + 1)]
fi = [fx(x) for x in xi]
plt.plot(xi, fi, label='f(x)')
plt.xlabel('x')
plt.ylabel('f(x)')
plt.title('Función f(x)')
plt.grid()
# Marcamos los puntos de la secante
xa_valores = [fila[0] for fila in tabla]
xb_valores = [fila[1] for fila in tabla]
xc_valores = [fila[2] for fila in tabla]
plt.plot(xa_valores, [fx(x) for x in xa_valores], 'go-', label='xa')
plt.plot(xb_valores, [fx(x) for x in xb_valores], 'ro-', label='xb')
plt.plot(xc_valores, [fx(x) for x in xc_valores], 'yo-', label='xc')
plt.legend()
plt.show()
aW1wb3J0IG1hdHBsb3RsaWIucHlwbG90IGFzIHBsdAoKZGVmIHNlY2FudGVfdGFibGEoZngsIHhhLCB0b2xlcmFuY2lhKToKICAgIGR4ID0gNCAqIHRvbGVyYW5jaWEKICAgIHhiID0geGEgKyBkeAogICAgdHJhbW8gPSBkeAogICAgdGFibGEgPSBbXQogICAgd2hpbGUgKHRyYW1vID49IHRvbGVyYW5jaWEpOgogICAgICAgIGZhID0gZngoeGEpCiAgICAgICAgZmIgPSBmeCh4YikKICAgICAgICB4YyA9IHhhIC0gZmEgKiAoeGIgLSB4YSkgLyAoZmIgLSBmYSkKICAgICAgICB0cmFtbyA9IGFicyh4YyAtIHhhKQogICAgICAgIAogICAgICAgIHRhYmxhLmFwcGVuZChbeGEsIHhiLCB4YywgdHJhbW9dKQogICAgICAgIHhiID0geGEKICAgICAgICB4YSA9IHhjCgogICAgcmV0dXJuIHRhYmxhCgphID0gMy41OTIKYiA9IDAuMDQyNjcKIyBMIGF0bS9tb2wgawpSID0gMC4wODIwNTQKcCA9IDEwCnhhID0gMS41CnRvbGVyYW5jaWEgPSAwLjAwMQp0cmFtb3MgPSAxMDAKCiMgVGVtcGVyYXR1cmEgcHJlZGVmaW5pZGEKVCA9IDMwMCAgIyBDYW1iaWEgZXN0ZSB2YWxvciBzZWfDum4gbGEgdGVtcGVyYXR1cmEgZGVzZWFkYQoKZnggPSBsYW1iZGEgeDogKHAgKyBhIC8geCoqMikgKiAoeCAtIGIpIC0gUiAqIFQKZGZ4ID0gbGFtYmRhIHg6IHAgLSAoYSAvIHgqKjIpICsgKDIgKiBhICogYiAvIHgqKjMpCnRhYmxhID0gc2VjYW50ZV90YWJsYShmeCwgeGEsIHRvbGVyYW5jaWEpCm4gPSBsZW4odGFibGEpCnJhaXogPSB0YWJsYVtuIC0gMV1bMl0KcHJpbnQoJ1Jhw616IGVuY29udHJhZGE6JywgcmFpeikKCiMgVmlzdWFsaXphY2nDs24gZ3LDoWZpY2EKeGkgPSBbYSArIGkgKiAoYiAtIGEpIC8gdHJhbW9zIGZvciBpIGluIHJhbmdlKHRyYW1vcyArIDEpXQpmaSA9IFtmeCh4KSBmb3IgeCBpbiB4aV0KCnBsdC5wbG90KHhpLCBmaSwgbGFiZWw9J2YoeCknKQpwbHQueGxhYmVsKCd4JykKcGx0LnlsYWJlbCgnZih4KScpCnBsdC50aXRsZSgnRnVuY2nDs24gZih4KScpCnBsdC5ncmlkKCkKCiMgTWFyY2Ftb3MgbG9zIHB1bnRvcyBkZSBsYSBzZWNhbnRlCnhhX3ZhbG9yZXMgPSBbZmlsYVswXSBmb3IgZmlsYSBpbiB0YWJsYV0KeGJfdmFsb3JlcyA9IFtmaWxhWzFdIGZvciBmaWxhIGluIHRhYmxhXQp4Y192YWxvcmVzID0gW2ZpbGFbMl0gZm9yIGZpbGEgaW4gdGFibGFdCgpwbHQucGxvdCh4YV92YWxvcmVzLCBbZngoeCkgZm9yIHggaW4geGFfdmFsb3Jlc10sICdnby0nLCBsYWJlbD0neGEnKQpwbHQucGxvdCh4Yl92YWxvcmVzLCBbZngoeCkgZm9yIHggaW4geGJfdmFsb3Jlc10sICdyby0nLCBsYWJlbD0neGInKQpwbHQucGxvdCh4Y192YWxvcmVzLCBbZngoeCkgZm9yIHggaW4geGNfdmFsb3Jlc10sICd5by0nLCBsYWJlbD0neGMnKQoKcGx0LmxlZ2VuZCgpCnBsdC5zaG93KCkK