W obliczu zadania, aby rozwiązać równanie transcendentalne:
K = K0*(exp(-t*B)/1+L*B)
Zmienna "b" jest nieznana. Muszę wziąć następny wyrażenie dla B na pierwszy krok:
B = (K0-1)/(L+t)
Na drugi krok i dla wszystkich kolejnych kroków muszę obliczyć b jako:
B = -(1/t)*ln((1+L*B)/K0)
Iteracja zatrzymuje się, gdy względna różnica między poprzednim a bieżącą wartością dla B nie przekracza, powiedzmy, 1%. Powstały B powinien dokonać pierwszej części prawej równania być równe 1. Jak mogę to zrobić z python? Słyszałem o procedurach zerowych z Scipy, ale naprawdę wolałbym pewne zwykłe kodowanie (pomogłaby mi lepiej zrozumieć rzeczy). Próbowałem pętli podczas pętli. Mogę napisać pętlę do Iterrue i przestać iterację, gdy K z pierwszego równania jest wystarczająco blisko do 1,0:
kinf = 1.123456e+00
tau = 2.832995e+01
L2 = 3.745903e+00
i = 1
b2 = (kinf-1)/(L2+tau)
def iterate():
b = b2
i = 1
print "iteration no.{:.1f}; B^2 = {:.06e}; delta = {:.03f}".format(i, b, kinf*((exp(-tau*b))/(1+L2*b)) - 1.0)
while abs(kinf*((exp(-tau*b))/(1+L2*b))-1.0)>0.0001:
b = -(1/tau)*log((1+L2*b)/kinf)
i+=1
print "iteration no.{:.1f}; B^2 = {:.06e}; delta = {:.03f}".format(i, b, kinf*((exp(-tau*b))/(1+L2*b)) - 1.0)
Ale nie rozumiem, jak porównać poprzednie i aktualne wartości B. Przypuszczam, że ten problem jest jednym z klasycznych, ale doceniam jakąkolwiek pomoc.
Updatek: Dziękuję za pomoc! Czy robię to teraz?
def iterate():
b0 = (kinf-1)/(L2+tau)
bold = b0
b = -(1/tau)*log((1+L2*b0)/kinf)
bnew = b
diff = ((bnew-bold)/bnew)*100
while abs(diff)>=0.01:
print 'previous B^2 = {:.06e}'.format(bold)
bnew = -(1/tau)*log((1+L2*bold)/kinf)
print 'B^2 = {:.06e}'.format(bnew)
diff = ((bnew-bold)/bnew)*100
print 'delta = {:.06e}'.format(diff)
bold = bnew
2 odpowiedzi
Nie zastępuj b
w tej linii (trażesz starej wartości b
w ten sposób):
b = -(1/tau)*log((1+L2*b)/kinf) # the old value of b gets lost here
Zamiast tego możesz to zrobić w swoim while
- Loop:
b_new = -(1/tau)*log((1+L2*b)/kinf)
b_delta = b_new - b
# do whatever you want with b_delta and finally override the old b with the new b
b = b_new
Aby to osiągnąć podczas iteracji, możesz utworzyć zmienną previous_b
i zainicjować go do None
. Następnie w pętli, kontynuuj, jeśli poprzednia_b nie jest nona lub różnica jest większa niż próg.
kinf = 1.123456e+00
tau = 2.832995e+01
L2 = 3.745903e+00
i = 1
b2 = (kinf-1)/(L2+tau)
def iterate():
previous_b = None
b = b2
i = 1
print "iteration no.{:.1f}; B^2 = {:.06e}; delta = {:.03f}".format(i, b, kinf*((exp(-tau*b))/(1+L2*b)) - 1.0)
while previous_b is None or abs(kinf*((exp(-tau*b))/(1+L2*b))-1.0)>0.0001:
previous_b = b
b = -(1/tau)*log((1+L2*b)/kinf)
i+=1
print "iteration no.{:.1f}; B^2 = {:.06e}; delta = {:.03f}".format(i, b, kinf*((exp(-tau*b))/(1+L2*b)) - 1.0)
Podobne pytania
Powiązane pytania
Nowe pytania
python
Python to wielozadaniowy, wielozadaniowy język programowania dynamicznie typowany. Został zaprojektowany tak, aby był szybki do nauczenia się, zrozumienia i użycia oraz wymuszania czystej i jednolitej składni. Należy pamiętać, że Python 2 oficjalnie nie jest obsługiwany od 01-01-2020. Mimo to, w przypadku pytań Pythona specyficznych dla wersji, dodaj znacznik [python-2.7] lub [python-3.x]. Korzystając z wariantu Pythona (np. Jython, PyPy) lub biblioteki (np. Pandas i NumPy), należy umieścić go w tagach.