声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2399|回复: 3

[经典算法] 一次二阶矩程序

[复制链接]
发表于 2008-3-26 16:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
请问哪位有一次二阶矩的源程序啊?谢谢了,小弟进来急需,再次感谢了
vb,fortran或matlab都可以。
回复
分享到:

使用道具 举报

发表于 2008-4-4 21:44 | 显示全部楼层
一个例子:

  1. 题目:编制改进一次二阶矩法计算可靠指标的程序,并给出算例,要求提供源程序,算法语言不限。

  2. 选取的算例为:z=g(x,y)=x*y-1140,其中x,y服从正态分布,μx=38,Vx=0.1, μy=38,Vy=0.05

  3. 本程序采用Matlab编写。

  4. 选取β1=3.0,β2=2.5

  5. 计算结果为:可靠指标β=4.2672,最终验算点为:(22.8430 , 49.9060),在验算点处功能函数值为:1.2354e-004



  6. %保存为strRlbt.m,在Matlab命令窗口中输入strRlbt执行即可

  7. N = 2;%变量个数

  8. miu = [38 54];%均值

  9. v = [0.1 0.05];%变异系数

  10. sgma = miu .* v;%方差

  11. syms x y

  12. g = sym('x * y - 1140');%功能函数

  13. jacg = jacobian( g ,[x;y]);%计算雅可比矩阵

  14. initvalue = [miu;v;sgma];%用作函数参数

  15. %选取beta,定义x0=miu

  16. beta1 = 3.0;

  17. xopt0 = [38 54];

  18. alpha0 = zeros(1,2);

  19. [ alpha1 , xopt1 , result ] = calforbeta( initvalue , beta1 , alpha0 , xopt0 , jacg , g );

  20. if result == 1

  21.    disp('第一次假定的饧次煽恐副辏');

  22.    return

  23. end



  24. %再次假定beta

  25. beta2 = 2.5;

  26. xopt0 = miu - beta2 * alpha1 .* sgma;

  27. gvalue = jacgfunc(jacg,xopt1);

  28. alpha0 = (sgma .* gvalue) / sqrt(sum((sgma .* gvalue).^2));

  29. [ alpha2 , xopt2 , result ] = calforbeta( initvalue , beta2 , alpha0 ,  xopt0 , jacg , g );

  30. if result == 1

  31.    disp('第二次假定的饧次煽恐副辏');

  32.    return

  33. end



  34. %beta迭代求解

  35. g1 = gfunc(g,xopt1);

  36. g2 = gfunc(g,xopt2);

  37. eps = 0.1; %精度

  38. while abs(g2) > eps

  39.    temp = beta2;

  40.    beta2 = beta2 - (beta2 - beta1)/(g2 - g1) * g2;

  41.    beta1 = temp;

  42.    [ alpha2 , xopt2 , result ] = calforbeta( initvalue , beta2 , alpha1 ,  xopt1 , jacg , g );

  43.    temp = g2;

  44.    g2 = gfunc(g,xopt2);

  45.    g1 = temp;

  46.    if result == 1

  47.       break

  48.    end

  49. end

  50. disp('可靠指标为:');

  51. disp(beta2);

  52. disp('最终验算点为:');

  53. disp(xopt2);

  54. disp('在验算点处功能函数值为:');

  55. disp(g2);



  56. function g_out = gfunc( g , x_in )

  57. %功能函数值计算

  58. x = x_in(1);

  59. y = x_in(2);

  60. g_out = eval(g);%函数值

  61. %将以上内容保存为gfunc.m



  62. function g_out = jacgfunc( jacg , x_in )

  63. %功能函数偏导数计算,即雅可比矩阵计算

  64. x = x_in(1);

  65. y = x_in(2);

  66. for i = 1:2

  67.    g_out(i) = eval(jacg(i));%1为对x的导数,2为对y的导数

  68. end

  69. %将以上内容保存为jacgfunc.m



  70. function [ alpha1 , xopt1 ,result ] = calforbeta( initvalue , beta0 , alpha0 , xopt0 , jacg , g)

  71. %对选取的beta进行计算

  72. result = 0;

  73. N = length(xopt0);

  74. alpha = alpha0;

  75. xopt = xopt0;

  76. %initvalue为初始值

  77. miu = initvalue(1,:);%第一行为均值

  78. v = initvalue(2,:);%第二行为变异系数

  79. sgma = initvalue(3,:);%第三行为方差

  80. eps = 0.1;

  81. while 1

  82.    %功能函数达到精度则退出循环,result=1表示计算出可靠指标

  83.    if abs(gfunc(g,xopt0)) < eps

  84.       alpha1 = alpha0;

  85.       xopt1 = xopt0;

  86.       result = 1;

  87.       break;

  88.    end

  89.    %计算alpha和新的验算点xopt

  90.    gvalue = jacgfunc(jacg,xopt);

  91.    sgmaz = sqrt(sum((sgma .* gvalue).^2));

  92.    alpha0 = sgma .* gvalue / sgmaz;

  93.    xopt0 = miu - beta0 * alpha0 .* sgma;

  94.    sum1 = sum((alpha - alpha0).^2);

  95.    sum2 = sum((xopt - xopt0).^2);

  96.    alpha = alpha0;

  97.    xopt = xopt0;

  98.    %醝和验算点xi达到精度则退出循环

  99.    if sum1 < 0.001 | sum2 < 0.001

  100.       alpha1 = alpha0;

  101.       xopt1 = xopt0;

  102.       break;

  103.    end

  104. end

  105. %将以上内容保存为calforbeta.m
复制代码


来自http://littlebees.blog.hexun.com/14143949_d.html
 楼主| 发表于 2008-4-6 18:38 | 显示全部楼层
非常感谢风花雪月的热情回复,谢谢
收下了:lol
发表于 2009-4-29 19:27 | 显示全部楼层
第一次假定的饧次煽恐副辏?什么意思?。。。
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-22 11:05 , Processed in 0.094808 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表