实现“一次二阶矩演算点法”,可以用C、C++、C#,其他编程语言也可以
存为strRlbt.m,在Matlab命令窗口中输入strRlbt执行即可
N=2;%变量个数
miu=[3854];%均值
v=[0.10.05];%变异系数
sgma=miu.*v;%方差
symsxy
g=sym(x*y-1140);%功能函数
jacg=jacobian(g,[x;y]);%计算雅可比矩阵
initvalue=[miu;v;sgma];%用作函数参数
%选取beta,定义x0=miu
beta1=3.0;
xopt0=[3854];
alpha0=zeros(1,2);
[alpha1,xopt1,result]=calforbeta(initvalue,beta1,alpha0,xopt0,jacg,g);
ifresult==1
disp(第一次假定的饧次煽恐副辏);
return
%再次假定beta
beta2=2.5;
xopt0=miu-beta2*alpha1.*sgma;
gvalue=jacgfunc(jacg,xopt1);
alpha0=(sgma.*gvalue)/sqrt(sum((sgma.*gvalue).^2));
[alpha2,xopt2,result]=calforbeta(initvalue,beta2,alpha0,xopt0,jacg,g);
ifresult==1
disp(第二次假定的饧次煽恐副辏);
return
%beta迭代求解
g1=gfunc(g,xopt1);
g2=gfunc(g,xopt2);
eps=0.1;%精度
whileabs(g2)>eps
temp=beta2;
beta2=beta2-(beta2-beta1)/(g2-g1)*g2;
beta1=temp;
[alpha2,xopt2,result]=calforbeta(initvalue,beta2,alpha1,xopt1,jacg,g);
temp=g2;
g2=gfunc(g,xopt2);
g1=temp;
ifresult==1
break
disp(可靠指标为:);
disp(beta2);
disp(最终验算点为:);
disp(xopt2);
disp(在验算点处功能函数值为:);
disp(g2);
functiong_out=gfunc(g,x_in)
%功能函数值计算
x=x_in(1);
y=x_in(2);
g_out=eval_r(g);%函数值
%将以上内容保存为gfunc.m
functiong_out=jacgfunc(jacg,x_in)
%功能函数偏导数计算,即雅可比矩阵计算
x=x_in(1);
y=x_in(2);
fori=1:2
g_out(i)=eval_r(jacg(i));%1为对x的导数,2为对y的导数
%将以上内容保存为jacgfunc.m
function[alpha1,xopt1,result]=calforbeta(initvalue,beta0,alpha0,xopt0,jacg,g)
%对选取的beta进行计算
result=0;
N=length(xopt0);
alpha=alpha0;
xopt=xopt0;
%initvalue为初始值
miu=initvalue(1,:);%第一行为均值
v=initvalue(2,:);%第二行为变异系数
sgma=initvalue(3,:);%第三行为方差
eps=0.1;
while1
%功能函数达到精度则退出循环,result=1表示计算出可靠指标
ifabs(gfunc(g,xopt0))
alpha1=alpha0;
xopt1=xopt0;
result=1;
break;
%计算alpha和新的验算点xopt
gvalue=jacgfunc(jacg,xopt);
sgmaz=sqrt(sum((sgma.*gvalue).^2));
alpha0=sgma.*gvalue/sgmaz;
xopt0=miu-beta0*alpha0.*sgma;
sum1=sum((alpha-alpha0).^2);
sum2=sum((xopt-xopt0).^2);
alpha=alpha0;
xopt=xopt0;
%醝和验算点xi达到精度则退出循环
ifsum1<0.001|sum2<0.001
alpha1=alpha0;
xopt1=xopt0;
break;
%将以上内容保存为calforbeta.m
本回答由提问者推荐
这样的数据该怎么理解?
s hcg是每个人不一样的 你隔天去抽血翻倍就是正常的,孕酮不是很高,下次抽血看涨了就应该说没什么
这样的数据该怎么理解?
s hcg是每个人不一样的 你隔天去抽血翻倍就是正常的,孕酮不是很高,下次抽血看涨了就应该说没什么