clear; clc; close all;
fprintf('===== 钢筋混凝土轴心受压短柱可靠度分析 =====\n');
mu_R = 4560; sigma_R = 729.6; delta_R = sigma_R / mu_R;
sigma_lnR = sqrt(log(1 + delta_R^2)); mu_lnR = log(mu_R) - 0.5 * sigma_lnR^2;
mu_NG = 1159.1; sigma_NG = 81.1;
mu_NL = 765.5; sigma_NL = 222;
alpha_NL = pi/(sigma_NL*sqrt(6)); gamma = 0.5772156649; u_NL = mu_NL - gamma/alpha_NL;
fprintf('随机变量参数:\n'); fprintf('R (抗力,对数正态): μ=%.1f kN, σ=%.1f kN, δ=%.4f\n', mu_R, sigma_R, delta_R); fprintf(' 对数空间参数: μ_ln=%.6f, σ_ln=%.6f\n', mu_lnR, sigma_lnR);
fprintf('N_G (恒载,正态): μ=%.1f kN, σ=%.1f kN\n', mu_NG, sigma_NG); fprintf('N_L (活载,极值I型): μ=%.1f kN, σ=%.1f kN\n', mu_NL, sigma_NL); fprintf(' 极值I型参数: α=%.6f, u=%.4f\n\n', alpha_NL, u_NL);
fprintf('-------- JC法计算 --------\n');
tol = 1e-6; max_iter = 50; x = [mu_R, mu_NG, mu_NL]; beta_old = 0;
fprintf('JC法迭代过程:\n'); for iter = 1:max_iter R = x(1); NG = x(2); NL = x(3); Z = R - NG - NL; grad = [1, -1, -1]; u_R = (log(R) - mu_lnR) / sigma_lnR; F_R = normcdf(u_R); f_R = (1/(R*sigma_lnR*sqrt(2*pi))) * exp(-0.5*u_R^2); sigma_R_eq = normpdf(norminv(F_R)) / f_R; mu_R_eq = R - sigma_R_eq * norminv(F_R); F_NL = exp(-exp(-alpha_NL*(NL - u_NL))); if F_NL > 0 && F_NL < 1 f_NL = alpha_NL * exp(-alpha_NL*(NL - u_NL)) * F_NL; sigma_NL_eq = normpdf(norminv(F_NL)) / f_NL; mu_NL_eq = NL - sigma_NL_eq * norminv(F_NL); else sigma_NL_eq = sigma_NL; mu_NL_eq = mu_NL; end mu_NG_eq = mu_NG; sigma_NG_eq = sigma_NG; mu_eq = [mu_R_eq, mu_NG_eq, mu_NL_eq]; sigma_eq = [sigma_R_eq, sigma_NG_eq, sigma_NL_eq]; sigma_grad = grad .* sigma_eq; norm_sigma_grad = norm(sigma_grad); alpha = -sigma_grad / norm_sigma_grad; mu_Z = Z + grad * (mu_eq - x)'; sigma_Z = norm_sigma_grad; beta = mu_Z / sigma_Z; x_new = mu_eq + beta * (sigma_eq .* alpha); fprintf('迭代 %2d: β=%.6f, R*=%.1f, N_G*=%.1f, N_L*=%.1f\n',iter, beta, x(1), x(2), x(3)); if iter > 1 && abs(beta - beta_old) < tol fprintf('\nJC法收敛于迭代 %d 次\n', iter); break; end beta_old = beta; x = x_new; if iter == max_iter fprintf('警告:JC法达到最大迭代次数!\n'); end end
beta_JC = beta; Pf_JC = normcdf(-beta_JC); design_point_JC = x;
fprintf('\nJC法最终结果:\n'); fprintf(' 可靠指标: β_JC = %.6f\n', beta_JC); fprintf(' 失效概率: P_f = Φ(-β) = %.6e\n', Pf_JC); fprintf(' 可靠度: R = 1 - P_f = %.6f\n', 1-Pf_JC); fprintf(' 设计验算点:\n'); fprintf(' R* = %.1f kN\n', design_point_JC(1)); fprintf(' N_G* = %.1f kN\n', design_point_JC(2)); fprintf(' N_L* = %.1f kN\n', design_point_JC(3)); fprintf(' 验证: Z(R*,N_G*,N_L*) = %.2e ≈ 0\n\n', design_point_JC(1)-design_point_JC(2)-design_point_JC(3));
fprintf('-------- 蒙特卡罗法计算 --------\n');
N_MC = 1000000; fprintf('蒙特卡罗模拟,样本量:N = %d\n\n', N_MC);
rng(42); fprintf('生成随机样本...\n');
U_R = randn(N_MC, 1); R_samples = exp(mu_lnR + sigma_lnR * U_R);
NG_samples = mu_NG + sigma_NG * randn(N_MC, 1);
U_NL = rand(N_MC, 1); NL_samples = u_NL - (1/alpha_NL) * log(-log(U_NL));
Z_samples = R_samples - NG_samples - NL_samples;
failure_mask = Z_samples <= 0; failure_count = sum(failure_mask);
Pf_MC = failure_count / N_MC; R_MC = 1 - Pf_MC; beta_MC = -norminv(Pf_MC);
if failure_count > 0 cov_Pf = sqrt((1-Pf_MC)/(N_MC*Pf_MC)); z_95 = 1.96; CI_lower = Pf_MC * (1 - z_95 * cov_Pf); CI_upper = Pf_MC * (1 + z_95 * cov_Pf); else cov_Pf = 0; CI_lower = 0; CI_upper = 0; end
fprintf('蒙特卡罗法结果:\n'); fprintf(' 抽样次数: N = %d\n', N_MC); fprintf(' 失效次数: N_f = %d\n', failure_count); fprintf(' 失效概率: P_f = %.6e\n', Pf_MC); fprintf(' 可靠度: R = %.6f\n', R_MC); fprintf(' 可靠指标: β_MC = %.6f\n', beta_MC); fprintf(' 精度指标: COV(P_f) = %.4f\n', cov_Pf); fprintf(' 95%%置信区间: [%.6e, %.6e]\n', CI_lower, CI_upper);
Z_mean = mean(Z_samples); Z_std = std(Z_samples); fprintf(' 功能函数统计: μ_Z = %.2f, σ_Z = %.2f, μ_Z/σ_Z = %.4f',Z_mean, Z_std, Z_mean/Z_std);
|