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
0
yxfxmx 12 sierpień 2014, 16:11

2 odpowiedzi

Najlepsza odpowiedź

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
0
Matt 12 sierpień 2014, 12:22

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)
0
Andrew Johnson 12 sierpień 2014, 12:21