工程力学与统计学交叉研究
专注于工程质量预测、结构安全分析、非线性数值计算
工程力学专栏
理论力学、材料力学、结构力学、弹性力学、结构动力学等9个方向,附MATLAB实现代码
统计学专栏
线性回归、Logistic回归、Cox生存分析、泊松回归等5个统计模型,附Python工程应用代码
✨ 精选内容
结构动力学14讲
从单自由度到非线性时程分析,完整MATLAB实现
混凝土质量预测
基于Logistic回归的施工质量预测系统
不符合项关闭时间预测
Cox风险比例回归模型工程应用
🏗️ 工程力学专栏
1. 理论力学
静力学、运动学、动力学,刚体运动分析
2. 材料力学
拉压剪扭弯,梁的应力与变形计算
3. 结构力学
桁架、刚架分析,矩阵位移法
4. 弹性力学
平面问题,应力函数解法
5. 弹塑性力学
屈服准则,本构关系
6. 结构动力学 ⭐
14篇专题详解,完整MATLAB代码
7. 混凝土结构
构件承载力计算程序
8. 钢结构
连接计算,构件稳定
9. 土木工程施工
施工组织,网络计划技术
📊 统计学专栏
1. 线性回归模型
最小二乘估计,假设检验,Python实现
2. Logistic回归
二分类,混凝土质量预测案例
3. Cox风险比例回归
生存分析,不符合项关闭时间预测
4. 泊松回归
计数数据建模,安全事故预测
5. 非线性模型
广义线性模型,非线性最小二乘
💻 代码资源库
单自由度运动方程建立
MATLAB单自由度体系参数计算与状态空间建模
%% 单自由度体系参数定义与运动方程建立
clear;clc;close all;
%% 1. 结构参数
m = 100e3; % 质量 kg (100t)
k = 20e6; % 刚度 N/m (20000kN/m)
xi = 0.05; % 阻尼比
%% 2. 计算动力特性
omega = sqrt(k/m); % 自振圆频率 rad/s
f = omega/(2*pi); % 自振频率 Hz
T = 2*pi/omega; % 自振周期 s
c = 2*xi*m*omega; % 阻尼系数 N·s/m
fprintf('自振圆频率 omega = %.2f rad/s\n',omega);
fprintf('自振频率 f = %.2f Hz\n',f);
fprintf('自振周期 T = %.3f s\n',T);
fprintf('阻尼系数 c = %.2f N·s/m\n',c);
%% 3. 建立状态空间矩阵
A = [0, 1; -omega^2, -2*xi*omega];
B = [0; 1/m];
C = [1, 0; 0, 1; -omega^2, -2*xi*omega];
D = [0; 0; 1/m];
%% 4. 建立状态空间模型(需Control工具箱)
sys = ss(A,B,C,D);
disp('状态空间模型建立完成,可直接用于时程分析');
有阻尼自由振动计算
MATLAB自由振动衰减曲线与阻尼比识别
%% 单自由度有阻尼自由振动计算
clear;clc;close all;
%% 结构参数
m = 100e3; k = 20e6; xi = 0.05;
omega = sqrt(k/m);
omegad = omega*sqrt(1-xi^2);
T = 2*pi/omega;
%% 初始条件
x0 = 0.01; v0 = 0;
t = 0:0.01:5;
%% 自由振动位移解析解
x = exp(-xi*omega*t).*(x0*cos(omegad*t) + (v0+xi*omega*x0)/omegad*sin(omegad*t));
%% 绘图
figure('Color','w');
plot(t,x,'b-','LineWidth',1.5);
xlabel('时间 t(s)'); ylabel('位移 x(m)');
title('单自由度有阻尼自由振动位移时程'); grid on;
%% 对数衰减率计算阻尼比
n = 5;
x1 = max(x(1:round(T/0.01)));
xn = max(x(round(n*T/0.01):round((n+1)*T/0.01)));
delta = log(x1/xn)/n;
xi_calc = delta/(2*pi);
fprintf('理论阻尼比: %.4f, 计算阻尼比: %.4f\n',xi,xi_calc);
Duhamel积分受迫振动
MATLAB任意荷载下响应的Duhamel积分数值计算
%% Duhamel积分计算任意荷载下响应
clear;clc;close all;
%% 结构参数
m = 100e3; k = 20e6; xi = 0.05;
omega = sqrt(k/m);
omegad = omega*sqrt(1-xi^2);
dt = 0.01; t = 0:dt:10; nt = length(t);
%% 简谐荷载
F0 = 10e3; theta = 0.8*omega;
f = F0*sin(theta*t);
%% Duhamel积分
x = zeros(1,nt);
for i = 2:nt
tau = 0:dt:t(i);
h = 1/(m*omegad)*exp(-xi*omega*(t(i)-tau)).*sin(omegad*(t(i)-tau));
x(i) = trapz(tau, f(1:i).*h);
end
%% 解析解对比
beta = theta/omega;
Rd = 1/sqrt((1-beta^2)^2 + (2*xi*beta)^2);
xst = F0/k;
x_analytic = xst*Rd*sin(theta*t);
figure('Color','w');
plot(t,x,'b-',t,x_analytic,'r--','LineWidth',1.5);
xlabel('时间 t(s)'); ylabel('位移 x(m)');
legend('Duhamel积分数值解','解析解');
title('简谐荷载下位移时程'); grid on;
多自由度矩阵组装
MATLAB质量矩阵、刚度矩阵、Rayleigh阻尼矩阵组装
%% 多自由度体系矩阵组装
clear;clc;close all;
n = 3;
m = [200e3; 200e3; 150e3];
k = [30e6; 25e6; 20e6];
xi1 = 0.05; xi2 = 0.05;
%% 集中质量矩阵
M = diag(m);
disp('质量矩阵 M:'); disp(M);
%% 剪切型刚度矩阵
K = zeros(n,n);
for i = 1:n
if i < n
K(i,i) = k(i) + k(i+1);
K(i,i+1) = -k(i+1);
K(i+1,i) = -k(i+1);
else
K(i,i) = k(i);
end
end
disp('刚度矩阵 K:'); disp(K);
%% Rayleigh阻尼矩阵
[V,D] = eig(K,M);
omega = sort(sqrt(diag(D)));
omega1 = omega(1); omega2 = omega(2);
alpha = 2*omega1*omega2*(xi2*omega1 - xi1*omega2)/(omega1^2 - omega2^2);
beta = 2*(xi1*omega1 - xi2*omega2)/(omega1^2 - omega2^2);
C = alpha*M + beta*K;
fprintf('alpha = %.4f, beta = %.6f\n',alpha,beta);
disp('阻尼矩阵 C:'); disp(C);
自振频率与振型计算
MATLAB特征值求解、振型归一化、振型图绘制
%% 自振频率与振型计算
clear;clc;close all;
n = 3;
m = [200e3; 200e3; 150e3];
k = [30e6; 25e6; 20e6];
M = diag(m);
K = zeros(n,n);
for i = 1:n
if i < n
K(i,i) = k(i) + k(i+1);
K(i,i+1) = -k(i+1);
K(i+1,i) = -k(i+1);
else
K(i,i) = k(i);
end
end
%% 广义特征值求解
[V,D] = eig(K,M);
[omega, idx] = sort(sqrt(diag(D)));
V = V(:,idx);
f = omega/(2*pi); T = 2*pi./omega;
%% 振型归一化(最大位移为1)
for i = 1:n
V(:,i) = V(:,i)/max(abs(V(:,i)));
end
disp('各阶自振周期(s):'); disp(T');
disp('振型矩阵:'); disp(V);
%% 绘制振型图
figure('Color','w');
for i = 1:n
subplot(1,n,i);
plot([0;V(:,i)],0:n,'bo-','LineWidth',1.5,'MarkerFaceColor','b');
xlabel('位移'); ylabel('楼层');
title(['第',num2str(i),'阶振型 T=',num2str(T(i),'%.3f'),'s']);
grid on; axis equal;
end
sgtitle('结构振型图');
振型分解反应谱法
MATLAB抗震规范反应谱计算、SRSS振型组合
%% 振型分解反应谱法计算地震作用
clear;clc;close all;
n = 3;
m = [200e3; 200e3; 150e3];
k = [30e6; 25e6; 20e6];
M = diag(m);
K = zeros(n,n);
for i = 1:n
if i < n
K(i,i) = k(i) + k(i+1);
K(i,i+1) = -k(i+1);
K(i+1,i) = -k(i+1);
else
K(i,i) = k(i);
end
end
[V,D] = eig(K,M);
[omega,idx] = sort(sqrt(diag(D))); V = V(:,idx);
T = 2*pi./omega;
%% 振型质量归一化
for i = 1:n
Mn = V(:,i)'*M*V(:,i);
V(:,i) = V(:,i)/sqrt(Mn);
end
%% 8度设防II类场地反应谱
alpha_max = 0.16; Tg = 0.35; gamma = 0.9; eta2 = 1.0;
alpha = zeros(n,1);
for i = 1:n
if T(i) < 0.1, alpha(i) = (0.45 + 5.5*T(i))*alpha_max;
elseif T(i) < Tg, alpha(i) = eta2*alpha_max;
elseif T(i) < 5*Tg, alpha(i) = (Tg/T(i))^gamma*eta2*alpha_max;
else, alpha(i) = (eta2*0.2^gamma - 0.02*(T(i)-5*Tg))*alpha_max;
end
end
%% 振型参与系数与地震作用
gamma_n = V'*M*ones(n,1);
F = zeros(n,n);
for j = 1:n
F(:,j) = alpha(j)*gamma_n(j)*M*V(:,j)*9.8;
end
%% 层剪力SRSS组合
V_mode = zeros(n,n);
for j = 1:n
V_mode(n,j) = F(n,j);
for i = n-1:-1:1
V_mode(i,j) = V_mode(i+1,j) + F(i,j);
end
end
V = sqrt(sum(V_mode.^2,2));
disp('各层地震剪力(kN):'); disp(V/1000);
中心差分法时程分析
MATLAB显式逐步积分法时程计算
%% 中心差分法时程分析
clear;clc;close all;
n = 3;
m = [200e3;200e3;150e3]; k = [30e6;25e6;20e6]; xi=0.05;
M = diag(m); K=zeros(n,n);
for i=1:n
if i
Newmark-β法时程分析
MATLAB隐式平均加速度法时程计算
%% Newmark-β法时程分析(平均加速度法)
clear;clc;close all;
n = 3;
m = [200e3;200e3;150e3]; k = [30e6;25e6;20e6]; xi=0.05;
M = diag(m); K=zeros(n,n);
for i=1:n
if i
双线性恢复力模型
MATLAB双线性弹塑性恢复力滞回曲线计算
%% 双线性恢复力模型
clear;clc;close all;
k0 = 20e6; Fy = 100e3; alpha = 0.05;
uy = Fy/k0; k1 = alpha*k0;
t = 0:0.01:10;
u = 0.02*sin(2*pi*0.5*t);
nt = length(u);
F = zeros(1,nt);
F(1) = 0; u_last = 0; F_last = 0;
state = 0;
for i=2:nt
du = u(i) - u(i-1);
if state == 0
F_trial = F_last + k0*du;
if F_trial > Fy
state = 1; F(i) = Fy + k1*(u(i)-uy);
elseif F_trial < -Fy
state = -1; F(i) = -Fy + k1*(u(i)+uy);
else F(i) = F_trial; end
elseif state == 1
if du < 0
state = 0; F(i) = F_last + k0*du;
else F(i) = F_last + k1*du; end
else
if du > 0
state = 0; F(i) = F_last + k0*du;
else F(i) = F_last + k1*du; end
end
u_last = u(i); F_last = F(i);
end
figure('Color','w');
plot(u,F,'b-','LineWidth',1.5);
xlabel('位移 u(m)'); ylabel('恢复力 F(N)');
title('双线性恢复力滞回曲线');
grid on; axis equal;
弹塑性时程分析
MATLAB双线性模型+Newmark法+牛顿迭代弹塑性时程
%% 弹塑性时程分析
clear;clc;close all;
m = 100e3; k0=20e6; xi=0.05; Fy=80e3; alpha=0.05;
omega = sqrt(k0/m); c = 2*xi*m*omega;
gamma=0.5; beta=0.25; dt=0.02; t=0:dt:10; nt=length(t);
u=zeros(1,nt);v=zeros(1,nt);a=zeros(1,nt);
a(1)=0; Fs=0; state=0; u_last=0; Fs_last=0;
P = zeros(1,nt); P(10) = 120e3;
for i=1:nt-1
u(i+1) = u(i);
for iter=1:20
du = u(i+1) - u_last;
if state==0
kt = k0; Fs_trial = Fs_last + kt*du;
if Fs_trial>Fy
state=1; Fs=Fy+alpha*k0*(u(i+1)-Fy/k0); kt=alpha*k0;
elseif Fs_trial<-Fy
state=-1; Fs=-Fy+alpha*k0*(u(i+1)+Fy/k0); kt=alpha*k0;
else Fs=Fs_trial; end
elseif state==1
kt=alpha*k0;
if du<0, state=0; kt=k0; Fs=Fs_last+kt*du;
else Fs=Fs_last+kt*du; end
else
kt=alpha*k0;
if du>0, state=0; kt=k0; Fs=Fs_last+kt*du;
else Fs=Fs_last+kt*du; end
end
a(i+1) = 1/(beta*dt^2)*(u(i+1)-u(i)) - 1/(beta*dt)*v(i) - (1/(2*beta)-1)*a(i);
v(i+1) = v(i) + dt*((1-gamma)*a(i)+gamma*a(i+1));
R = P(i+1) - m*a(i+1) - c*v(i+1) - Fs;
K_hat = kt + gamma/(beta*dt)*c + 1/(beta*dt^2)*m;
du_iter = K_hat\R;
u(i+1) = u(i+1) + du_iter;
if norm(du_iter)<1e-8, break; end
end
u_last=u(i+1); Fs_last=Fs;
end
figure('Color','w');
plot(t,u,'b-','LineWidth',1);
xlabel('时间(s)');ylabel('位移(m)');
title('弹塑性时程分析位移时程');grid on;
Newmark-β法通用函数
MATLAB多自由度体系地震响应计算通用函数
function [u, v, a] = newmark_beta(M, K, C, P, dt, beta, gamma)
% Newmark-β法求解结构动力响应
% 输入:M-质量矩阵 K-刚度矩阵 C-阻尼矩阵
% P-荷载向量(nt*n列,每列对应一个时刻) dt-时间步长
% beta, gamma-积分参数,默认beta=0.25,gamma=0.5(平均加速度法)
if nargin<7, gamma=0.5; end
if nargin<6, beta=0.25; end
n = size(M,1);
nt = size(P,2);
u = zeros(n,nt); v = zeros(n,nt); a = zeros(n,nt);
% 初始加速度
a(:,1) = M\(P(:,1) - C*v(:,1) - K*u(:,1));
% 有效刚度矩阵
K_hat = K + gamma/(beta*dt)*C + 1/(beta*dt^2)*M;
for i = 1:nt-1
% 有效荷载
P_hat = P(:,i+1) + M*(1/(beta*dt^2)*u(:,i) + 1/(beta*dt)*v(:,i) + (1/(2*beta)-1)*a(:,i)) ...
+ C*(gamma/(beta*dt)*u(:,i) + (gamma/beta-1)*v(:,i) + dt*(gamma/(2*beta)-1)*a(:,i));
u(:,i+1) = K_hat\P_hat;
a(:,i+1) = 1/(beta*dt^2)*(u(:,i+1)-u(:,i)) - 1/(beta*dt)*v(:,i) - (1/(2*beta)-1)*a(:,i);
v(:,i+1) = v(:,i) + dt*((1-gamma)*a(:,i) + gamma*a(:,i+1));
end
end
Mises屈服准则可视化
MATLABπ平面上Mises与Tresca屈服面对比
% Mises屈服准则可视化
theta = linspace(0, 2*pi, 100);
sigma_s = 235; % 屈服强度 MPa
% Mises圆(π平面)
r_mises = sqrt(2/3)*sigma_s*ones(size(theta));
x_mises = r_mises.*cos(theta);
y_mises = r_mises.*sin(theta);
% Tresca六边形
r_tresca = sigma_s./(sqrt(2)*cos(theta-pi/6 - pi/3*floor((theta-pi/6)/(pi/3))));
x_tresca = r_tresca.*cos(theta);
y_tresca = r_tresca.*sin(theta);
figure('Color','w'); hold on; axis equal;
plot(x_mises, y_mises, 'b-', 'LineWidth', 2);
plot(x_tresca, y_tresca, 'r--', 'LineWidth', 2);
xlabel('\sigma_1'''); ylabel('\sigma_2''');
legend('Mises屈服准则','Tresca屈服准则','Location','best');
title('π平面屈服面对比');
grid on;
混凝土施工质量预测(Logistic回归)
Python基于sklearn的混凝土施工质量合格预测
import pandas as pd
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, roc_auc_score
from sklearn.preprocessing import StandardScaler
# 加载混凝土施工数据
# 特征:水泥用量、水灰比、坍落度、养护温度、养护时间等
data = pd.read_csv('concrete_quality.csv')
X = data.drop('quality_pass', axis=1)
y = data['quality_pass'] # 1=合格, 0=不合格
# 数据划分与标准化
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# 训练Logistic回归模型
model = LogisticRegression(random_state=42)
model.fit(X_train_scaled, y_train)
# 模型评估
y_pred = model.predict(X_test_scaled)
y_pred_proba = model.predict_proba(X_test_scaled)[:,1]
print(classification_report(y_test, y_pred))
print(f"AUC: {roc_auc_score(y_test, y_pred_proba):.4f}")
# 新样本预测
new_sample = scaler.transform([[380, 0.45, 160, 25, 28]])
quality_prob = model.predict_proba(new_sample)[0,1]
print(f"施工质量合格概率: {quality_prob:.2%}")
Cox生存分析(不符合项关闭时间预测)
Python基于lifelines的生存分析工程应用
import pandas as pd
from lifelines import CoxPHFitter
import matplotlib.pyplot as plt
# 加载生存数据
# T-时间, E-事件(1=发生,0=删失), 其余为协变量
data = pd.read_csv('survival_data.csv')
# 拟合Cox模型
cph = CoxPHFitter()
cph.fit(data, duration_col='T', event_col='E')
# 输出结果
cph.print_summary()
# 绘制森林图
plt.figure(figsize=(8,6))
cph.plot()
plt.title('Cox模型风险比森林图')
plt.tight_layout()
plt.savefig('cox_forest.png', dpi=300)
# 预测生存曲线
cph.predict_survival_function(data.iloc[0:3]).plot()
plt.title('不同个体的生存曲线预测')
plt.ylabel('生存概率 S(t)')
plt.xlabel('时间')
👨🔬 关于我
李明瑧
工程力学与统计学交叉领域研究者,专注于核电工程质量预测与结构安全分析。 主要研究方向包括:工程质量预测与评估、结构安全分析与可靠度、工程结构动力学与抗爆分析、非线性数值计算。
🔬 研究方向
- 工程质量预测与评估(Logistic回归、机器学习)
- 结构安全分析与可靠度(随机振动、动力可靠度)
- 工程结构动力学与抗爆分析(时程分析、弹塑性分析)
- 非线性数值计算方法(有限元、逐步积分法)