找回密码
 欢迎注册
查看: 22277|回复: 2

[原创] 从成败型试验结果准确计算产品可靠度的 VB 程序

[复制链接]
发表于 2017-5-7 22:23:12 | 显示全部楼层 |阅读模式

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

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
        大约 10 年前,本人开始学了一点 VB 编程,结合当时学的产品检验和可靠性方面的知识,依据国军标《火工品可靠性评估方法》GJB376-1987 中的方法,编写了一个 VB 程序,该程序的目的就是根据产品批量、抽验数量、试验(检验)失效数(不合格数)、以及规定的置信度,来判定该批产品的可靠度是多少。
        该国军标适合于产品批量较大,抽验数量可以较多的情况。

        定义可靠度.png

  1. ' 成败型试验可靠度准确计算  计算依据:《火工品可靠性评估方法》GJB376-87
  2.    Private Sub Form_Click()
  3.    Open "批量500,抽50,失效1,置信度0.95.txt" For Output As 1   'R=0.912149
  4.      nn = 500      '批量
  5.      n = 50        '抽样数
  6.      F = 1         '失效数
  7.      D = 0.95      '置信度
  8.      
  9.      
  10.      R1 = 0: R2 = 1     '根在这个范围
  11.      pi = 3.1415926535: e = 2.718281828459
  12.      Dim h(50)
  13.      Dim B(50)
  14.      B(2) = 1 / 6: B(4) = -1 / 30: B(6) = 1 / 42: B(8) = -1 / 30: B(10) = 5 / 66
  15.      B(12) = -691 / 2730: B(14) = 7 / 6: B(16) = -3617 / 510: B(18) = 43867 / 798
  16.      B(20) = -174611 / 330: B(22) = 854513 / 138: B(24) = -236364091 / 2730
  17.      B(26) = 8553103 / 6: B(28) = -23749461029# / 870: B(30) = 8615841276005# / 14322
  18.      B(32) = -7709321041217# / 510: B(34) = 2577687858367# / 6
  19.      B(36) = -2.63152715530535E+19 / 1919190: B(38) = 2.92999391384156E+15 / 6
  20.      B(40) = -2.61082718496449E+20 / 13530: B(42) = 1.52009764391807E+21 / 1806
  21.      B(44) = -2.7833269579301E+22 / 690: B(46) = 5.96451111593912E+23 / 282
  22.      B(48) = -5.60940336899782E+27 / 46410: B(50) = 4.9505720524108E+26 / 66
  23.      
  24.      GoTo 10
  25. 20:  If y < 0 Then R1 = R: GoTo 10
  26.      If y > 0 Then R2 = R: GoTo 10
  27.      
  28. 10:  k = k + 1
  29.      R = (R1 + R2) / 2
  30.      
  31.      If nn > 100 Then GoTo 40
  32.    
  33.      
  34.      x = nn * R: If x < 10 Then GoSub sub1: a1 = aaa      'a1 = (NR)!
  35.      x = nn * R: If x >= 10 Then GoSub sub2: a1 = aaa
  36.      
  37.      x = nn * R - n: If x < 10 Then GoSub sub1: a2 = aaa  'a2 = (NR-n)!
  38.      x = nn * R - n: If x >= 10 Then GoSub sub2: a2 = aaa
  39.          
  40.      a3 = 1                                               'a3 = (N)!/(N-n)!
  41.      For i = nn - n + 1 To nn
  42.      a3 = a3 * i
  43.      Next i
  44.      
  45.      GoSub sub4
  46.          
  47.      y = a1 / a2 / a3 * z - (1 - D)
  48.             
  49.      GoTo 50
  50.      
  51. 40:  x = nn * R: GoSub sub3: L1 = LLL        'L1 = Log(NR)!
  52.      x = nn - n: GoSub sub3: L2 = LLL        'L2 = Log(N-n)!
  53.      x = nn: GoSub sub3: L3 = LLL            'L3 = Log(N)!
  54.      x = nn * R - n: GoSub sub3: L4 = LLL    'L4 = Log(NR-n)!
  55.      GoSub sub4
  56.      
  57.      y = L1 + L2 - L3 - L4 + Log(z) - Log(1 - D)
  58.      
  59. 50: If k / 2 = Int(k / 2) And k <= 50 Then
  60.            Print Tab(2); "k = "; k;: Print #1, Tab(2); "k = "; k;
  61.          If y >= 0 Then
  62.            Print Tab(12); "y="; Format(y, " ##0.000000000000000")
  63.            Print #1, Tab(12); "y="; Format(y, " ##0.000000000000000")
  64.            Else
  65.            Print Tab(12); "y="; Format(y, "###0.000000000000000")
  66.            Print #1, Tab(12); "y="; Format(y, "###0.000000000000000")
  67.          End If
  68.      End If
  69.      
  70.      If k < 40 Then GoTo 20
  71.      If k >= 40 Then GoTo 30
  72.                
  73. 30:  Print: Print #1,
  74.      Print Tab(12); "R = "; Format(R, "0.000000")
  75.      Print #1, Tab(12); "R = "; Format(R, "0.000000")
  76.      Print Tab(12); "y = "; Format(y, "0.00000000000000")
  77.      Print #1, Tab(12); "y = "; Format(y, "0.00000000000000")
  78.      
  79. 999: Close
  80.      Exit Sub
  81.      End
  82.      
  83. sub1:  '广义阶乘子程序
  84.     nnn = 1000000
  85.     aaa = 1
  86.     For i = 1 To nnn
  87.     If x + i = 0 Then x = -i + 0.00001
  88.     aaa = aaa * i / (x + i)
  89.     Next i
  90.     aaa = aaa * nnn ^ x
  91.     Return
  92.         
  93. sub2: '用斯特林公式计算广义阶乘 x!
  94.     c1 = (1 + 1 / (12 * x) + 1 / (288 * x ^ 2))
  95.     c1 = c1 - 139 / (51840 * x ^ 3) - 571 / (2488320 * x ^ 4) + 163879 / (209018880 * x ^ 5)
  96.     aaa = Sqr(2 * pi * x) * (x / e) ^ x * c1
  97.     Return
  98.    
  99. sub3: '用斯特林公式计算广义阶乘的对数
  100.     If x <= 20 Then GoSub sub1: LLL = Log(aaa): Return
  101.      c1 = 0
  102.     For kv = 1 To 15 '25
  103.      c = B(2 * kv) / (2 * kv) / (2 * kv - 1) / (x ^ (2 * kv - 1))
  104.      c1 = c1 + c
  105.     Next kv
  106.    
  107.     LLL = (x + 0.5) * Log(x) - x + Log(Sqr(2 * pi)) + c1
  108.     Return
  109.    
  110. sub4:     '求系数 Z
  111.      h(0) = 1
  112.      For i = 1 To F
  113.        h(i) = h(i - 1) * (n - i + 1) * (nn - nn * R - i + 1) / i / (nn * R - n + i)
  114.      Next i
  115.      
  116.      z = 0
  117.      For i = 0 To F
  118.         z = z + h(i)
  119.      Next i
  120.     Return
  121.    
  122.     End Sub
  123.    
  124.      
复制代码



       按此程序算出的结果,与上述国军标书中所载表格数据对照,二者结果相同。书中不可能把一切数据全都列入,例如批量是 495 就不会列入,只能查到 500。置信度也是分为几个档次,不可能列出所有的值。抽验数量也同样。因此当标准中缺少某些数据时,可以用此程序计算。
      
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2017-5-7 22:29:39 | 显示全部楼层
我记得那本国军标书中,还附有一个用 basic 语言编写的程序,但是或许是印刷有误,书中的程序并不能运行。并且书中个别数据,精度也不足或是有点小错误。

不知道这个国军标,现在有没有新的版本。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2017-5-7 22:37:51 | 显示全部楼层
给出几个用此程序计算的例子:

   产品批量为 500,从中抽验 25 个,经试验(检验)后,失效数(不合格数)为 0,当置信度为 0.95 时,由上述程序算出该批产品的可靠度为 R=0.889808。
   产品批量为 500,从中抽验 25 个,经试验(检验)后,失效数(不合格数)为 0,当置信度为 0.85 时,由上述程序算出该批产品的可靠度为 R=0.928693。
   产品批量为 500,从中抽验 50 个,经试验(检验)后,失效数(不合格数)为 1,当置信度为 0.95 时,由上述程序算出该批产品的可靠度为 R=0.912149。
   产品批量为 1000,从中抽验 50 个,经试验(检验)后,失效数(不合格数)为 0,当置信度为 0.90 时,由上述程序算出该批产品的可靠度为 R=0.956105。
   产品批量为 1000,从中抽验 50 个,经试验(检验)后,失效数(不合格数)为 2,当置信度为 0.95 时,由上述程序算出该批产品的可靠度为 R=0.881360。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-11-25 09:14 , Processed in 0.023558 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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