【问题标题】:Transcendental Equation超越方程
【发布时间】:2014-08-12 12:11:59
【问题描述】:

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

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 的先前值和当前值。我想,这个问题是经典问题之一,但我感谢任何帮助。

更新: 感谢您的帮助! 我现在正在做吗?

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

【问题讨论】:

  • 您通常会为这种情况创建一个临时变量。例如old_b=b 在循环中更改 b 的值之前
  • 你需要在哪里做比较?
  • 我这样计算 B 的第一种方法:B = (K0-1)/(L+t),然后我需要开始计算 B 的下一种方法,例如:B = -(1/ t)*ln((1+L*B)/K0) 并将每个新的 B 与前一个进行比较,直到它们足够接近

标签: python equation


【解决方案1】:

不要在这一行覆盖b(这样会丢失b 的旧值):

b = -(1/tau)*log((1+L2*b)/kinf) # the old value of b gets lost here

相反,您可以在 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

【讨论】:

    【解决方案2】:

    要在迭代时完成此操作,您可以创建一个previous_b 变量并将其初始化为None。然后在您的 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)
    

    【讨论】:

      猜你喜欢
      • 2017-03-22
      • 1970-01-01
      • 1970-01-01
      • 2013-03-15
      • 1970-01-01
      • 1970-01-01
      • 2017-08-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多