簡體   English   中英

調用 function 的 while 循環機器學習三次求根算法代碼的邏輯中的問題或錯誤在哪里?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM