原文地址:用matlab编的计算结构可靠指标的改进一次二阶矩法程序(验算点法)作者:有点自恋 题目:编制改进一次二阶矩法计算可靠指标的程序,并给出算例,要求提供源程序,算法语言不限. 选取的算例为:z=g(x,y)=x*y-1140,其中x,y服从正态分布,μx=38,vx=0.1, μy=38,vy=0.05 本程序采用matlab编写. 选取β1=3.0,β2=2.5 计算结果为:可靠指标β=4.2672,最终验算点为:(22.8430 , 49.9060),在验算点处功能函数值为:1.2354e-004 %保存为strrlbt.m,在matlab命令窗口中输入strrlbt执行即可 n = 2;%变量个数 mi = [38 54];%均值 v = [0.1 0.05];%变异系数 sgma = mi .* v;%方差 syms x y g = sym( x * y - 1140 );%功能函数 jacg = jacobian( g ,[x;y]);%计算雅可比矩阵 initval e = [mi ;v;sgma];%用作函数参数 %选取beta,定义x0=mi beta1 = 3.0; xopt0 = [38 54]; alpha0 = zeros(1,2); [ alpha1 , xopt1 , res lt ] = calforbeta( initval e , beta1 , alpha0 , xopt0 , jacg , g ); if res lt == 1 disp( 第一次假定的饧次煽恐副辏 ); ret rn end %再次假定beta beta2 = 2.5; xopt0 = mi - beta2 * alpha1 .* sgma; gval e = jacgf nc(jacg,xopt1); alpha0 = (sgma .* gval e)  sqrt(s m((sgma .* gval e).^2)); [ alpha2 , xopt2 , res lt ] = calforbeta( initval e , beta2 , alpha0 , xopt0 , jacg , g ); if res lt == 1 disp( 第二次假定的饧次煽恐副辏 ); ret rn end %beta迭代求解 g1 = gf nc(g,xopt1); g2 = gf nc(g,xopt2); eps = 0.1; %精度 while abs(g2)  eps temp = beta2; beta2 = beta2 - (beta2 - beta1)(g2 - g1) * g2; beta1 = temp; [ alpha2 , xopt2 , res lt ] = calforbeta( initval e , beta2 , alpha1 , xopt1 , jacg , g ); temp = g2; g2 = gf nc(g,xopt2); g1 = temp; if res lt == 1 break end end disp( 可靠指标为: ); disp(beta2); disp( 最终验算点为: ); disp(xopt2); disp( 在验算点处功能函数值为: ); disp(g2); f nction g_o t = gf nc( g , x_in ) %功能函数值计算 x = x_in(1); y = x_in(2); g_o t = eval_r(g);%函数值 %将以上内容保存为gf nc.m f nction g_o t = jacgf nc( jacg , x_in ) %功能函数偏导数计算,即雅可比矩阵计算 x = x_in(1); y = x_in(2); for i = 1:2 g_o t(i) = eval_r(jacg(i));%1为对x的导数,2为对y的导数 end %将以上内容保存为jacgf nc.m f nction [ alpha1 , xopt1 ,res lt ] = calforbeta( initval e , beta0 , alpha0 , xopt0 , jacg , g) %对选取的beta进行计算 res lt = 0; n = length(xopt0); alpha = alpha0; xopt = xopt0; %initval e为初始值 mi = initval e(1,:);%第一行为均值 v = initval e(2,:);%第二行为变异系数 sgma = initval e(3,:);%第三行为方差 eps = 0.1; while 1 %功能函数达到精度则退出循环,res lt=1表示计算出可靠指标 if abs(gf nc(g,xopt0))  eps alpha1 = alpha0; xopt1 = xopt0; res lt = 1; break; end %计算alpha和新的验算点xopt gval e = jacgf nc(jacg,xopt); sgmaz = sqrt(s m((sgma .* gval e).^2)); alpha0 = sgma .* gval e  sgmaz; xopt0 = mi - beta0 * alpha0 .* sgma; s m1 = s m((alpha - alpha0).^2); s m2 = s m((xopt - xopt0).^2); alpha = alpha0; xopt = xopt0; %醝和验算点xi达到精度则退出循环 if s m1  0.001 | s m2  0.001 alpha1 = alpha0; xopt1 = xopt0; break;