[英]Where does the problem or bug lie in the logic of this while loop Machine Learning Cubic Root-Finding algorithmic code that calls a function?
目標:該程序的目標是為三次或 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 ”的全局function 我不確定它會如何,因為它應該在第一個循環而不是第六個循環中被標記。 重新初始化臨界值、高低猜測等看起來很好,以及“表格” function。 誰能看到我錯過了什么? 如果答案很明顯,請對我放松,因為我是 Python 的新手。
調試/自省注意事項:
昨天和今天早上,我試圖確保我的重新初始化正常並經過三重檢查。 我還從各種循環中打印了“tbl_val's”和“iter_num's” ,似乎沒有一個循環在迭代,或者對於半徑來說值太小了。 這可能是所有15 個單獨的 WHILE 循環的邏輯的整體問題,我不確定發生了什么,因為我正在注意重新初始化。 我有一種預感,它調用外部函數有問題,但如果這是真的,它應該在FIRST循環的開始就有問題。
注意:我試圖盡可能地減少代碼,但制表,第六個 WHILE 循環,函數以及輸入和初始條件是 output“tbl_val_6”的 KEY 和 MANDATORY。 此外,如果仍然不清楚我要做什么或需要查看更多代碼,我將立即並盡快編輯它!
你確定crit_lim_low
的價值嗎?
您在 while 循環的 if 子句中定義tbl_val_6
,其中循環和 if 子句都取決於crit_lim_low
的值。
如果crit_lim_low
<= 0.0005 則 while 循環根本不會運行,你也不會定義你的變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.