首页/文章/ 详情

非线性| 弧长法实例

3月前浏览4136

有关弧长法的内容已经有很多了,程序也有。即便这样,离实用还有很远的路要走。这里再发一个例子。《混凝土结构有限元分析第二版》第245页的例题,书中是手算演示,我这里用python实现。

python代码:

import math
defKT():
return1
defFint(x):
if x > 1 :
return1 - 0.15*(x-1)
else:
return2*x - x**2
f_ext = 1# 适应书中计算,假设外荷载为1
list_lamd = [0.75]  # 荷载步只有一步
tol  = 2e-2# 收敛参数,这个值主要是适应书中 5 步迭代
conv = 2e11
max_iter = 200# 单个荷载步最大迭代步数
niter = 0
last_sum_lamd = 0.75# 上一个收敛点,以下过程跟他没有关系?
last_fe  = last_sum_lamd * f_ext # 上一个收敛点对应的外荷载   1*0.75=0.75
last_sum_x = 0.5# 上一个收敛点
print('niter          x             lamda           conv')
for delta_lamd in list_lamd:
    delta_f = f_ext * delta_lamd   # 1*0.75 = 0.75
    lamd = 1
    Kt = KT()            # 常刚度迭代,同一荷载步下,切线刚度矩阵相同
    sum_x = 0
while ( conv > tol and niter < max_iter ):
        niter += 1
if niter == 1:            
            x1 = delta_f / Kt  
            sum_x = last_sum_x + x1  
            f_int = Fint(sum_x)
            sum_fe = last_fe + lamd * delta_f  #  
            f_resid = sum_fe - f_int
else:
            delta_x1 = delta_f / Kt
            delta_x2 = f_resid / Kt
            delta_lamd = (x1 * delta_x2)/(x1 * delta_x1 + 
                lamd * delta_f**2)
            delta_lamd = -1 * delta_lamd
            lamd = lamd + delta_lamd
            sum_fe = last_fe + lamd * delta_f  #
            dx = delta_lamd * delta_x1 + delta_x2
            x2 = x1 + dx
            sum_x = last_sum_x + x2
            f_int = Fint(sum_x)
            sum_fe = last_fe + lamd * delta_f  #  
            f_resid = sum_fe - f_int
            x1 = x2
        conv = math.sqrt( f_resid**2 )
        print(format(niter, '>3d'), format(sum_x, '>15.5f'), 
                    format(lamd, '>16.6f'), 
                    format(f_resid, '>18.6e') ) 
    last_sum_lamd = sum_fe
    last_sum_x =  sum_x
print(last_sum_lamd)
print(last_sum_x)

迭代过程如图所示

代码:

import numpy as np
import matplotlib.pyplot as plt
x1 = np.linspace(0,1,10)
y1 = 2*x1-x1**2
x2 = np.linspace(1,3,10)
y2 =  1 - 0.15*(x2-1)
# Figure 并指定大小
plt.figure(num=3,figsize=(8,5))
# 绘制F图像,设置 color 为 red,线宽度是 2,
plt.plot(x1, y1, color='red',linewidth=2.0)
plt.plot(x2, y2, color='red',linewidth=2.0)
# 四次迭代的数据
iter1 = [0.51.25]
iter1_0 = [0.751.5]
iter2 = [0.51.519]
iter2_0 = [0.751.231]
iter3 = [0.51.618]
iter3_0 = [0.751.023]
iter4 = [0.51.64]
iter4_0 = [0.750.929]
iter5 = [0.51.643]
iter5_0 = [0.750.909]
plt.plot(iter1, iter1_0, label="M1", linewidth = 2, color = "green",marker='o', markersize=7)
plt.plot(iter2, iter2_0, label="M1", linewidth = 2, color = "green",marker='o', markersize=7)
plt.plot(iter3, iter3_0, label="M1", linewidth = 2, color = "green",marker='o', markersize=7)
plt.plot(iter4, iter4_0, label="M1", linewidth = 2, color = "green",marker='o', markersize=7)
plt.plot(iter5, iter5_0, label="M1", linewidth = 2, color = "green",marker='o', markersize=7)
# 设置 x,y 轴的范围以及 label 标注
plt.xlim(0,3)
plt.ylim(0,1.7)
plt.xlabel('x',fontsize = 18)
plt.ylabel('F',fontsize = 18)
# 显示图像
plt.show()

对于荷载因子的理解有些混乱,还得继续查文献。

弧长法的Python实现

非线性| 弧长法算例

非线性|弧长法改进

来源:数值分析与有限元编程
非线性pythonUM
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2024-04-03
最近编辑:3月前
太白金星
本科 慢慢来
获赞 2粉丝 4文章 304课程 0
点赞
收藏
作者推荐
理想塑性材料的残余应力

如图1所示,圆杆 为理想塑性材料, , 作用在 点,然后撤去,求杆的残余应力。已知杆的半径为 。▲图1荷载 作用在杆 处,可能会有四种情况: 都处于弹性状态; 塑性而 还是弹性; 塑性而 还是弹性; 都进入塑性状态。按照弹性分析,得到 , 段已经屈服,而 段还处于弹性状态。实际上, 时,就开始屈服。此时 段内力为两段的应力分别为: 由于 段仍然处于弹性,伸长量为 屈服应变为: ▲图2▲图3当 作用在 点时, 段的应力应变行为由 移动到 , 段的应力应变行为由O移动到 。如图3所示,当撤去 ,相当于反方向施加一个大小相等的 。此时有完全的弹性变形发生, 段分别有反方向的 ,或者 此时,两部分的残余应力分别为: 移除外部荷载载将导致支反座力对弹性恢复作出响应。由于这些力会限制构件完全恢复,因此会在构件中产生残余应力。为了解决这类问题,可以将构件加载和卸载的整个循环视为正荷载(加载)与负荷载(卸载)的叠加。从O到C的荷载导致塑性应力分布,而沿CD的卸载仅导致弹性应力分布。叠加需要抵消这些荷载;然而,应力分布不会取消,因此残余应力将保留在构件中。▲图4来源:数值分析与有限元编程

未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈