python - 这个while循环机器学习三次求根算法代码调用函数的逻辑在哪里?
问题描述
目标:该程序的目标是为三次或 n 多项式求根方法/算法的收敛过程找到额外的加速器。
问题:由于某些我无法描述的未知原因,代码无法将 while 循环上部的一个变量制成表格。尽管变量“tbl_val_6”在第六个循环中已在上面(在代码中)明确定义,但未定义。(见“制表”代码中的第六行......)
制表:
z = [('Halley (Lower)','Original',act_rad,tbl_val_1**(10**9),iter_num_1),
('Halley (Upper)','Original',act_rad,tbl_val_2*(10**9),iter_num_3),
('Bisection','Original',act_rad,tbl_val_3*(10**9),iter_num_3),
('Regula Falsi','Original',act_rad,tbl_val_4*(10**9),iter_num_4),
('Secant','Original',act_rad,tbl_val_5*(10**9),iter_num_5),
('Halley (Lower)', 'Version 2',act_rad,tbl_val_6*(10**9),iter_num_6),
('Halley (Upper)','Original',act_rad,tbl_val_7*(10**9),iter_num_7),
('Bisection','Version 2',act_rad,tbl_val_8*(10**9),iter_num_8),
('Regula Falsi','Version 2',act_rad,tbl_val_9*(10**9),iter_num_9),
('Secant','Version 2',act_rad,tbl_val_10*(10**9),iter_num_10),
('Halley (Lower)', 'Version 3', act_rad,tbl_val_11*(10**9),iter_num_11),
('Halley (Upper)','Version 3', act_rad,tbl_val_12*(10**9),iter_num_12),
('Bisection','Version 3',act_rad,tbl_val_13*(10**9),iter_num_13),
('Regula Falsi','Version 3',act_rad,tbl_val_14*(10**9),iter_num_14),
('Secant','Version 3',act_rad,tbl_val_15*(10**9),iter_num_15),]
tbl = tabulate(z, headers=['Numerical Method','Version','Act. Val' 'Approx. Val','#Iterations'],
tablefmt='fancy_grid')
print(tbl)
print("***Where Version 2: Iterative Root and Version 3: Reciprocal Factorial: Convergence
Accelerators")
相关错误:
NameError Traceback (most recent call last)
<ipython-input-1-657a5a0a1bbf> in <module>
460 ('Regula Falsi','Original',act_rad,tbl_val_4*(10**9),iter_num_4),
461 ('Secant','Original',act_rad,tbl_val_5*(10**9),iter_num_5),
--> 462 ('Halley (Lower)', 'Version 2',act_rad,tbl_val_6*(10**9),iter_num_6),
463 ('Halley (Upper)','Original',act_rad,tbl_val_7*(10**9),iter_num_7),
464 ('Bisection','Version 2',act_rad,tbl_val_8*(10**9),iter_num_8),
NameError: name 'tbl_val_6' is not defined
这是计算迭代和近似三次根的十五个循环中的第六个。它不能定义“tbl_val_6”,因为定义它的变量“x_new_low_H_2”不能定义意味着它很可能在调用其循环结构之外的函数时遇到问题。或者我认为这是为什么其他人没有问题?:
第六循环(其中定义了“tbl_val_6” id)以及它和所有 15 的初始条件:
初始条件。
#Root-Finding Method Initial Conditions
crit_lim_low = 1000
crit_lim_up = 1000
itr = 0
第六圈(共 15 圈):
# Halley's (Lower)
while crit_lim_low > .0005:
x_new_low_H_2 = guess_low - ((2*f(guess_low)*df(guess_low))/((2*(df(guess_low))**2)-
(f(guess_low)*ddf(guess_low))))
crit_lim_low = abs(act_rad - x_new_low_H_2)
if crit_lim_low <= .0005:
itr += 1
iter_num_6 = itr #iter number for table
itr = 0 #Re-initializion
crit_lim_low = 1000
tbl_val_6 = x_new_low_H_2 #value of approx. root (table)
guess_low = act_rad - 10
break
elif itr >= 1000:
print("Lower Guess Halley's Method Failed(V.2): Check parameters.")
itr = 0
crit_lim_low = 1000
guess_low = act_rad - 10
break
else:
itr += 1
j = x_new_low_H_2**(1/itr)
guess_low = x_new_low_H_2 + j
函数 f(x)、df(x) 和 ddf(x) 是上面定义的函数,位于循环结构之外;为再现性显示的初始条件和约束:
输入/初始条件/功能:
print('User Assumptions/Limitations:')
print('\n')
print('1. Radial Upper Limit must be no more than 100 nanometers')
print('and Radial Lower Limit must be no less than 1 nanometer.')
print('2. Period of diffusion must not exceed 24 hours.')
print('3. Diffusion Rate should be reasonable a number of radial')
print('units (nm) per hour as to not supersede other constraints.***')
print('\n')
print('***Note: r = (dr/dt)t must be between RUL and RLL only!')
print('\n')
ul_rad = (10**(-9))*float(input('What is the radial upper limit (nm)? '))
ll_rad = (10**(-9))*float(input('What is the radial lower limit (nm)? '))
diff_t = (10**(-9))*float(input('What is the period of diffusion (hours)? '))
dr_dt = (10**(-9))*float(input('What is the volume rate of diffusion (nm/hour)? '))
#Formula Set-Up
pi = 3.14159265359
import math
#Prelim Calculation
act_rad = math.sqrt((((4/3)*pi*((ul_rad)**3)) - ((4/3)*pi*(dr_dt)*((diff_t)**3)) + ((4/3)*pi*
((ll_rad)**3)))*(3/(4*pi)))
guess_low = act_rad - 10
guess_up = act_rad + 10
##Functions for Root-Finding Methods
def f(x): #volume
return(((4/3)*pi*((ul_rad)**3)) - ((4/3)*pi*(x**3)) - ((4/3)*pi*(dr_dt)*((diff_t)**3)) +
((4/3)*pi*((ll_rad)**3)))
def df(x):#surface area
return((4*pi*((ul_rad)**2)) - (4*pi*(x**2)) - (4*pi*(dr_dt)*((diff_t)**2)) + (4*pi*
((ll_rad)**2)))
def ddf(x):#mean width times curvature
return(((8*pi*ul_rad) - (8*pi*x) - (8*pi*(dr_dt)*(diff_t)) + (8*pi*ll_rad)))
如果这需要“ x ”的全局函数,我不确定它会如何,因为它应该在第一个循环而不是第六个循环中被标记。重新初始化临界值、高低猜测等看起来都很好,以及“制表”功能。谁能看到我错过了什么?如果答案很明显,请放轻松,因为我是 Python 新手。
调试/自省注意事项:
昨天和今天早上,我试图确保我的重新初始化正常并经过三重检查。我还从各种循环中打印了“tbl_val's”和“iter_num's”,似乎没有一个循环在迭代,或者对于半径来说值太小了。这可能是所有15 个单独的 WHILE 循环的逻辑的整体问题,我不确定发生了什么,因为我正在注意重新初始化。我有一种预感,它调用外部函数有问题,但如果这是真的,它应该在FIRST循环的开始就有问题。
注意:我尝试尽可能地减少代码,但制表,第六个 WHILE 循环,函数以及输入和初始条件是该输出“tbl_val_6”的 KEY 和 MANDATORY。此外,如果仍然不清楚我要做什么或需要查看更多代码,我将立即并尽快编辑它!
解决方案
你确定 的价值crit_lim_low
吗?
您tbl_val_6
在 while 循环中的 if 子句中定义,循环和 if 子句都依赖于 的值crit_lim_low
。
如果crit_lim_low
<= 0.0005 则 while 循环根本不会运行,并且您不会定义变量。
推荐阅读
- bash - 删除文件中的行直到特定行
- javascript - 根据选项隐藏/显示 DIV 不起作用
- javascript - 使用中继器 asp.net 网络表单尝试动态轮播滑块
- ios - 如何在 UICollectionViewCell 中有一个自动换行标签,其右锚点约束到单元格的右锚点?
- groovy - 如何禁用groovyscript中的警告?
- github - Sonarqube 徽章在 github README 上不起作用
- python - 在python中匹配和添加reg表达式值
- c++ - 如何在 C++ 中创建自己的编译密钥
- selenium - 在函数内部/外部放置创建 Selenium WebDriver 实例的语句如何影响 find_elements_by_xpath?
- sql - 计算所有不同的行,然后加入另一个表