Python 超越方程

Python 超越方程,python,equation,Python,Equation,我面临着一个解决超越方程的任务: K = K0*(exp(-t*B)/1+L*B) 变量“B”未知。第一步,我必须使用B的下一个表达式: B = (K0-1)/(L+t) 对于第二步和接下来的所有步骤,我必须将B计算为: B = -(1/t)*ln((1+L*B)/K0) 当B的前一个值和当前值之间的相对差值不超过(比如)1%时,迭代停止。得到的B应该使第一个等式的右边部分等于1。 如何使用python实现这一点?我听说过scipy的寻零例程,但我真的更喜欢一些普通的编码,它可以帮助我更好

我面临着一个解决超越方程的任务:

K = K0*(exp(-t*B)/1+L*B)
变量“B”未知。第一步,我必须使用B的下一个表达式:

B = (K0-1)/(L+t)
对于第二步和接下来的所有步骤,我必须将B计算为:

B = -(1/t)*ln((1+L*B)/K0)
当B的前一个值和当前值之间的相对差值不超过(比如)1%时,迭代停止。得到的B应该使第一个等式的右边部分等于1。 如何使用python实现这一点?我听说过scipy的寻零例程,但我真的更喜欢一些普通的编码,它可以帮助我更好地理解事情。我试过while循环。当第一个方程中的K接近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)
但我不明白,我如何比较以前和现在的B值。我想,这个问题是一个经典的问题,但我感谢任何帮助

UPD: 谢谢你的帮助! 我现在正在做吗

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

要在迭代过程中完成此操作,可以创建一个前一个_b变量并将其初始化为无。然后在while循环中,如果previous_b为None或差异大于阈值,则继续

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)
不要在这一行中覆盖b,这样会丢失b的旧值:

b = -(1/tau)*log((1+L2*b)/kinf) # the old value of b gets lost here
相反,您可以在while循环中执行此操作:


您通常会为这种情况创建一个临时变量。e、 在改变循环中b的值之前,你需要在哪里进行比较?我计算b的第一个方法:b=K0-1/L+t,然后我需要开始计算b的下一个方法,比如:b=-1/t*ln1+L*b/K0,并将每个新的b与前一个进行比较,直到它们足够接近
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