python - 带有迭代的 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
解决方案
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
。
综上所述,根本原因是x
in 方法F(n)
是一个常量值。
推荐阅读
- casting - 不支持 CASE 内的强制转换列
- android - screenrecord没有在android oreo 8.1中捕获帧?
- web-services - 如果服务空闲,从 web api 调用的存储过程的响应时间很慢
- typescript - 限制离子幻灯片中的分页次数
- javascript - 每次都打别人
- python - 使用python将不同文件夹中的csv组合成一个excel表
- javascript - 使用break in for in循环最多10个属性
- git - 如何在 Git 中检索/保存文件的提交消息?
- django - Django 表单小部件:提交 onchange
- sql-server - 跨系统缓存到 MSSQL