如何使用while循环检查计算输出和收敛计算之间的差异

How to use while loop to check difference between calculation output , convergence calculation

我正在编写执行计算的代码:

def elastic_buckling_pressure(corroded_wall_thickness,
                              external_radius_mm,
                              lambda_value,
                              n_value,
                              youngs_modulus_mpa,
                              poissons_ratio):
    """
    """
    section_1 = (1 / ((n_value ** 2 + 0.5 * (lambda_value ** 2)) - 1)
                 ) * ((youngs_modulus_mpa * corroded_wall_thickness) / external_radius_mm)
    section_2_part_1 = ((n_value**2 + lambda_value**2 - 1)**2 / (12 *(1 - poissons_ratio**2))) * (
            corroded_wall_thickness / external_radius_mm)
    section_2_part_2 = lambda_value**4 / (n_value**2 + lambda_value**2)**2
    section_2 = section_2_part_1 + section_2_part_2
    calculated_pel_value = section_1 * section_2
    return calculated_pel_value

我想在每次迭代时传递从 2 开始的增量 n_value 值,然后是 +0.10。

然而,对于我正在编写的循环计数器的迭代,代码不起作用。

def iteration_calculation(corroded_wall_thickness,
                          external_radius_mm,
                          lambda_value,
                          n_value,
                          youngs_modulus_mpa,
                          poissons_ratio):
    epsilon = 0.00001
    count = 0
    max_iteration = 1000
    beta = 0.001
    while count < max_iteration:
        calculated_pel = elastic_buckling_pressure(corroded_wall_thickness=corroded_wall_thickness,
                                                   external_radius_mm=external_radius_mm,
                                                   lambda_value=lambda_value,
                                                   n_value=n_value,
                                                   youngs_modulus_mpa=youngs_modulus_mpa,
                                                   poissons_ratio=poissons_ratio)
        changed_n_value = n_value + 0.10
        changed_calculated_pel = elastic_buckling_pressure(corroded_wall_thickness=corroded_wall_thickness,
                                                           external_radius_mm=external_radius_mm,
                                                           lambda_value=lambda_value,
                                                           n_value=changed_n_value,
                                                           youngs_modulus_mpa=youngs_modulus_mpa,
                                                           poissons_ratio=poissons_ratio)
        change_value = changed_calculated_pel - calculated_pel
        if abs(change_value) < epsilon:
            beta = calculated_pel
            break
        else:
            beta = changed_calculated_pel
        count += 1
    value_calculated = beta * 1
    return value_calculated
training dataset
'corroded_wall_thickness': np.array([10]),
'external_radius_mm': np.array([250]),
'lambda_value': np.array([0.5]),
'n_value': np.array([2]),
'youngs_modulus_mpa': np.array([350000]),
'poissons_ratio': np.array([0.33])

但是代码没有迭代,我有点苦恼如何创建迭代循环。 我想至少实现 calculated_pel 和 changed_calculated_pel 之间的差异,如 epsilon 值 0.00001 所述。一旦实现,代码应该中断并给出收敛值。但是,我缺乏编码能力造成了更多问题。所以,今天我来找你帮忙。如有任何建议,我们将不胜感激。

谢谢!

对于可能遇到类似情况的任何人: 我已经设法解决了这个问题。

                                                                                                                         
def iteration_calculation(corroded_wall_thickness,                                                                        
                          external_radius_mm,                                                                             
                          lambda_value,                                                                                   
                          youngs_modulus_mpa,                                                                             
                          poissons_ratio):                                                                                
    list_value = {}                                                                                                       
    epsilon = 25                                                                                                          
    count = 0                                                                                                             
    max_iteration = 100000                                                                                                                                                                                                          
    min_value = float("inf")                                                                                              
    last_value = float("inf")                                                                                             
    changed_n_value = 2                                                                                                   
    while count < max_iteration:                                                                                         
                                                                                                                         
        new_value = elastic_buckling_pressure(corroded_wall_thickness=corroded_wall_thickness,                            
                                               external_radius_mm=external_radius_mm,                                    
                                               lambda_value=lambda_value,                                                
                                               n_value=changed_n_value,                                                  
                                               youngs_modulus_mpa=youngs_modulus_mpa,                                    
                                              poissons_ratio=poissons_ratio)                                             
        list_value[changed_n_value] = new_value                                                                          
        if abs(last_value - new_value) < epsilon:                                                                        
            break                                                                                                        
        last_value = new_value                                                                                           
                                                                                                                         
                                                                                                                         
        changed_n_value +=0.10                                                                                           
                                                                                                                         
        if new_value < min_value:                                                                                        
            min_value = new_value                                                                                        
        count+=1                                                                                                         
    return min_value, list_value