web-dev-qa-db-fra.com

Résoudre une équation en utilisant un python solveur numérique en numpy

J'ai une équation, comme suit:

R - ((1.0 - np.exp(-tau))/(1.0 - np.exp(-a*tau))) = 0.

Je veux résoudre pour tau dans cette équation en utilisant un solveur numérique disponible dans numpy. Quelle est la meilleure manière de s'occuper de ça?

Les valeurs de R et a dans cette équation varient pour différentes implémentations de cette formule, mais sont fixées à des valeurs particulières lorsqu'elle doit être résolue pour tau.

27
stars83clouds

En notation mathématique conventionnelle, votre équation est

$$ R = \frac{1 - e^{-\tau}}{1 - e^{-a\cdot\tau}}$$

La fonction SciPy fsolve recherche un point auquel une expression donnée est égale à zéro (un "zéro" ou une "racine" de l'expression). Vous devrez fournir à fsolve une estimation initiale qui est "proche" de la solution souhaitée. Un bon moyen de trouver une telle supposition initiale consiste simplement à tracer l'expression et à rechercher le passage par zéro.

#!/usr/bin/python

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import fsolve

# Define the expression whose roots we want to find

a = 0.5
R = 1.6

func = lambda tau : R - ((1.0 - np.exp(-tau))/(1.0 - np.exp(-a*tau))) 

# Plot it

tau = np.linspace(-0.5, 1.5, 201)

plt.plot(tau, func(tau))
plt.xlabel("tau")
plt.ylabel("expression value")
plt.grid()
plt.show()

# Use the numerical solver to find the roots

tau_initial_guess = 0.5
tau_solution = fsolve(func, tau_initial_guess)

print "The solution is tau = %f" % tau_solution
print "at which the value of the expression is %f" % func(tau_solution)
41
nibot

Vous pouvez réécrire l'équation sous la forme

eq

  • Pour les entiers a et non nuls R, vous obtiendrez a des solutions dans l'espace complexe;
  • Il existe des solutions analytiques pour a=0,1,...4 (voir ici );

Donc, en général, vous pouvez avoir une, plusieurs ou aucune solution et certaines ou toutes peuvent être des valeurs complexes. Vous pouvez facilement lancer scipy.root à cette équation, mais aucune méthode numérique ne garantira de trouver toutes les solutions.

Pour résoudre dans l'espace complexe:

import numpy as np
from scipy.optimize import root

def poly(xs, R, a):
    x = complex(*xs)
    err = R * x - x + 1 - R
    return [err.real, err.imag]

root(poly, x0=[0, 0], args=(1.2, 6))
10
behzad.nouri