首页 > 解决方案 > 这个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。此外,如果仍然不清楚我要做什么或需要查看更多代码,我将立即并尽快编辑它!

标签: pythonfunctionloopsdebugginglogic

解决方案


你确定 的价值crit_lim_low吗?

tbl_val_6在 while 循环中的 if 子句中定义,循环和 if 子句都依赖于 的值crit_lim_low

如果crit_lim_low<= 0.0005 则 while 循环根本不会运行,并且您不会定义变量。


推荐阅读