首页 > 解决方案 > 带有迭代的 inf 和 nan 值

问题描述

之前有带有 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 def error (Rra,Rrn): Erel = abs((Rrn - Rra) / Rrn) * 100 return Erel

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

标签: python

解决方案


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))

Rr通过除以F(Rs) - F(Ri)0 来计算。这在数学中是非法的。你的情况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

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


推荐阅读