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



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

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。

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

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之间的差值最小,如ε值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                                                                                         

最新更新