【问题标题】:inf and nan values with iterations带有迭代的 inf 和 nan 值
【发布时间】:2021-03-14 21:53:24
【问题描述】:

之前有Rs值的代码

from numpy import exp as e
Ri = 9
Rr = 19/2
Rs = 10
i = 0
Er = 0
Rra = 0
x = 1

def F(n):
    return 745*(1-e(-x/10))-49*x

#Funion para calcular el error relativo 定义错误(Rra,Rrn): Erel = abs((Rrn - Rra) / Rrn) * 100 返回埃雷尔

print ('{:^15}{:^15}{:^15}{:^15}{:^15}{:^15}'.format('# iter','Ri','Rs','Rr','F(Ri)','Erel(%)'))
      
while (i < 10):
    Er = error(Rra,Rr)
    Rra = Rr `#Rra sera el Rr anterior para determinar el error relativo`
    if F(Ri).all() * F(Rr).all() < 0:
        Rs = Rr
    elif F(Ri).all() * F(Rr).all() > 0:
        Ri = Rr
    elif F(Rr) == 0:
        print('La raiz es',Rr)

    Rr = (Ri + Rs) / 2
    i = i + 1

    #Condicional para el primer error relativo

    if i == 1:
             print ('{:^15}{:^15.6f}{:^15.6f}{:^15.6f}{:^15.6f}'.format(i-1,Ri,Rs,Rr,F(Rr)))
    elif i > 1:
             print ('{:^15}{:^15.6f}{:^15.6f}{:^15.6f}{:^15.6f}{:^15.10f}'.format(i-1,Ri,Rs,Rr,F(Rr),Er))

我正在开发一个必须使用 Regula Falsi 方法的练习,但是在获得结果中的相应迭代时,我得到了 inf 和 nan 值,有人可以指导我或告诉我它有什么问题吗?

from numpy import exp as e
 
Ri = 9
Rr = 10
i = 0
Er = 0
x = 1
 
def F(n):
    return 745*(1-e(-x/10))-49*x
 
#Funcion para calcular el error relativo
def error (Rra,Rrn):
    Erel = abs((Rrn - Rra) / Rrn) * 100
    return Erel
 
 
print ('{:^15}{:^15}{:^15}{:^15}{:^15}{:^25}'.format('# iter','Ri','Rs','Rr','F(Rr)','Erel(%)'))
 
while (i < 10):
    Er = error(Rra,Rr)
    Rra = Rr #Rra sera el Rr anterior para determinar el error relativo
    if F(Ri) * F(Rr) < 0:
        Rs = Rr
    elif F(Ri) * F(Rr) > 0:
        Ri = Rr
    elif F(Rr) == 0:
        print('La raiz es',Rr)
 
    Rr = (F(Rs)*Ri -F(Ri)*Rs)/(F(Rs) - F(Ri))
 
    i = i + 1
 
     #Condicional para el primer error relativo
 
    if i == 1:
             print ('{:^15}{:^15.10f}{:^15.10f}{:^15.10f}{:^15.10f}'.format(i-1,Ri,Rs,Rr,F(Rr)))
    elif i > 1:
             print ('{:^15}{:^15.10f}{:^15.10f}{:^15.10f}{:^15.10f}{:^25.10f}'.format(i-1,Ri,Rs,Rr,F(Rr),Er))

结果

# iter           Ri             Rs             Rr            F(Rr)              Erel(%)
       0        10.0000000000  10.0000000000       nan       21.8961235632
       1             nan       10.0000000000       nan       21.8961235632            nan
       2             nan       10.0000000000       nan       21.8961235632            nan
       3             nan       10.0000000000       nan       21.8961235632            nan
       4             nan       10.0000000000       nan       21.8961235632            nan
       5             nan       10.0000000000       nan       21.8961235632            nan
       6             nan       10.0000000000       nan       21.8961235632            nan
       7             nan       10.0000000000       nan       21.8961235632            nan
       8             nan       10.0000000000       nan       21.8961235632            nan
       9             nan       10.0000000000       nan       21.8961235632            nan
/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:30: RuntimeWarning: invalid value encountered in double_scalars

【问题讨论】:

  • 你在哪里写了Rr = (F(Rs)*Ri -F(Ri)*Rs)/(F(Rs) - F(Ri)),你希望RsRi 第一次运行时的值是多少?因此,F(Rs) - F(Ri) 的结果应该是什么?你知道这是如何导致问题的吗?另外:Rs 的初始值应该来自哪里?
  • 我添加 Rs 值的来源

标签: python


【解决方案1】:
x = 1
 
def F(n):
    return 745*(1-e(-x/10))-49*x

在您的 F(n) 方法中,x 是一个赋值为 1 且永不更改的值。所以F(n) 将始终返回相同的值21.896123563210153

    if F(Ri) * F(Rr) < 0:
        Rs = Rr
    elif F(Ri) * F(Rr) > 0:
        Ri = Rr
    elif F(Rr) == 0:
        print('La raiz es',Rr)

因此,F(Ri) * F(Rr) 始终为正值。因此Ri 的值与Rr 相同。

Rr = (F(Rs)*Ri -F(Ri)*Rs)/(F(Rs) - F(Ri))

您通过将F(Rs) - F(Ri) 除以 0 来计算 Rr。这在数学上是非法的。所以Rr 在你的情况下是nan

在第一个循环之后,Ri 被赋值为Rr

def error (Rra,Rrn):
    Erel = abs((Rrn - Rra) / Rrn) * 100
    return Erel

Er = error(Rra,Rr)

Rrn 的值为Rr。在(Rrn - Rra) / Rrn 中,除以nan 值。这个结果nan

综上所述,根本原因是方法F(n)中的x是一个常量值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-24
    • 2014-05-03
    • 2018-01-26
    • 2019-01-09
    • 2014-01-29
    • 2021-06-29
    • 2012-11-08
    • 1970-01-01
    相关资源
    最近更新 更多