ワイブル分布

 物体の強度を統計的に表すために、ワイブルによって提案された確率分布。
時間に対する、劣化や寿命を統計的に表すために広く利用されています。

m ワイブル係数(形状パラメータ)
η 尺度パラメータ

時間に対する故障率

平均値は次の計算です、Γはガンマ関数

 ここでのプログラムは、確率分布、上下累積分布、下側累積値からパーセント点の計算で、平均値μ、故障率λ(t)の計算はプログラムにありません。

プログラム

unit Main;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls,
  VclTee.TeeGDIPlus, VCLTee.Series, VCLTee.TeEngine, VCLTee.TeeProcs,
  VCLTee.Chart, Vcl.Buttons, system.Math, system.UITypes;

type
  TForm1 = class(TForm)
    LabeledEdit1: TLabeledEdit;
    LabeledEdit2: TLabeledEdit;
    LabeledEdit3: TLabeledEdit;
    LabeledEdit4: TLabeledEdit;
    RadioGroup1: TRadioGroup;
    BitBtn1: TBitBtn;
    Memo1: TMemo;
    Chart1: TChart;
    Series1: TLineSeries;
    Series2: TPointSeries;
    Series3: TLineSeries;
    Series4: TLineSeries;
    procedure BitBtn1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private 宣言 }
    procedure imageclear;
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//----------------------確率密度-----------------------
// t パーセント点
// m ワイブル係数
// n 尺度係数
//-----------------------------------------------------
function probability_densyty(t, m, n: double):double;
var
  tsn : double;
begin
  tsn := t / n;
  result := m / n * power(tsn, m - 1) * exp(-power(tsn, m));
end;

//-------------------下側累積確率--------------------
// t パーセント点
// m ワイブル係数
// n 尺度係数
//-----------------------------------------------------
function lower_cumulative(t, m, n: double):double;
var
  tsn : double;
begin
  tsn := t / n;
  result := 1 - exp(-power(tsn, m));
end;

//-------------------上側累積確率--------------------
// t パーセント点
// m ワイブル係数
// n 尺度係数
//-----------------------------------------------------
function upper_cumulative(t, m, n: double):double;
var
  tsn : double;
begin
  tsn := t / n;
  result := exp(-power(tsn, m));
end;

//-------------------逆下側累積確率------------------
// p 下側累積確率
// m ワイブル係数
// n 尺度係数
//-----------------------------------------------------
function Inverse_lower_cumulative(p, m, n: double): double;
var
  q: double;
  lnp: double;
begin
  if p >= 1 then begin
    result := infinity;
    exit;
  end;
  q := 1 - p;
  lnp := ln(q);
  result := exp(ln(-lnp * power(n, m)) / m);
end;

//-------グラフバックグラウンド消去-------
procedure TForm1.imageclear;
begin
  with Chart1.BackImage.Bitmap.Canvas do begin
    Brush.Color := clWhite;
    Brush.Style := bsSolid;
    FillRect(Rect(0, 0, Chart1.Width, Chart1.Height));
    Font.Size := 11;
  end;
end;

//----- 計算 グラフ描画-------
procedure TForm1.BitBtn1Click(Sender: TObject);
const
  c = 200;
var
  t, m, n, p: double;
  i : integer;
  f, pl, q, tl, ft: double;
  max, dx, x, d: double;
  col : Tcolor;
begin
  val(LabeledEdit1.Text, m, i);
  if i <> 0 then begin
    MessageDlg('mの値に間違いがあります。', mtInformation,
      [mbOk], 0, mbOk);
    exit;
  end;
  if m <= 0 then begin
    MessageDlg('mの値が範囲外です。', mtInformation,
      [mbOk], 0, mbOk);
    exit;
  end;
  val(LabeledEdit2.Text, n, i);
  if i <> 0 then begin
    MessageDlg('ηの値に間違いがあります。', mtInformation,
      [mbOk], 0, mbOk);
    exit;
  end;
  if n <= 0 then begin
    MessageDlg('ηの値が範囲外です。', mtInformation,
      [mbOk], 0, mbOk);
    exit;
  end;
  val(LabeledEdit3.Text, t, i);
  if i <> 0 then begin
    MessageDlg('tの値に間違いがあります。', mtInformation,
      [mbOk], 0, mbOk);
    exit;
  end;
  if t < 0 then begin
    MessageDlg('tの値が範囲外です。', mtInformation,
      [mbOk], 0, mbOk);
    exit;
  end;
  val(LabeledEdit4.Text, p, i);
  if i <> 0 then begin
    MessageDlg('pの値に間違いがあります。', mtInformation,
      [mbOk], 0, mbOk);
    exit;
  end;
  if (p < 0) or (p > 1) then begin
    MessageDlg('pの値が範囲外です。', mtInformation,
      [mbOk], 0, mbOk);
    exit;
  end;
  memo1.Clear;
  f := probability_densyty(t, m, n);          // 確率密度
  pl := lower_cumulative(t, m, n);            // 下側累積確率
  q := upper_cumulative(t, m, n);             // 上側累積確率
  tl := Inverse_lower_cumulative(p, m, n);    // 逆下側累積確率
  memo1.Lines.Add('確率密度(パーセント点 t=' + floatTostr(t) + ')');
  memo1.Lines.Add('  f(t)=' + floatTostr(f));
  memo1.Lines.Add(' 下側累積確率  F(t)=' + floatTostr(pl));
  memo1.Lines.Add(' 上側累積確率  R(t)=' + floatTostr(q));
  memo1.Lines.Add('パーセント点(下側累積確率 P=' + floatTostr(p) + ')');
  memo1.Lines.Text := memo1.Lines.Text + '  t=' + floatTostr(tl);
  Series1.Clear;
  Series2.Clear;
  Series3.Clear;
  Series4.Clear;
  imageclear;
  if RadioGroup1.ItemIndex = 0 then begin
    Series3.LinePen.Width := 1;
    max := 5;
    if t > max - 1 then max := round(t) + 1;
    dx := max / c;
    for i := 0 to c do begin
      x := dx * i;
      d := probability_densyty(x, m, n);
      if x <= t then col := clRed else col := clblue;
      Series1.AddXY(x, d,'', col);
      Series3.AddXY(x, 0,'', col);
      Series3.AddXY(x, d,'', col);
      Series3.AddXY(x, 0,'', col);
    end;
    Series2.AddXY(t, f);
  end;
  if RadioGroup1.ItemIndex = 1 then begin
    max := 4;
    if t > max - 1 then max := round(t) + 1;
    dx := max / c;
    for i := 0 to c do begin
      x := dx * i;
      d := lower_cumulative(x, m, n);
      Series1.AddXY(x, d, '', clred);
      d := upper_cumulative(x, m, n);
      Series4.AddXY(x, d, '', clBlue);
    end;
    with Chart1.BackImage.Bitmap.Canvas do begin
      Font.Color := clRed;
      TextOut(150,100,'赤 下側累積確率');
      Font.Color := clBlue;
      TextOut(150,120,'青 上側累積確率');
    end;
    application.ProcessMessages;
    Series3.LinePen.Width := 3;
    Series3.AddXY(t, 0,'', clBlack);
    Series3.AddXY(t, Chart1.LeftAxis.Maximum,'', clBlack);
  end;
  if RadioGroup1.ItemIndex = 2 then begin
    Series3.LinePen.Width := 1;
    if p >= 1 then begin
      with Chart1.BackImage.Bitmap.Canvas do begin
        Font.Color := clBlack;
        TextOut(100,60,'下側累積確率 P = 1');
        TextOut(110,80,'パーセント点 t= 無限大');
        exit;
      end;
    end;
    ft := probability_densyty(tl, m, n);
    max := 2;
    if tl > max - 1 then max := round(tl) + 1;
    dx := max / c;
    for i := 0 to c do begin
      x := dx * i;
      d := probability_densyty(x, m, n);
      if x <= tl then col := clRed else col := clblue;
      Series1.AddXY(x, d,'', col);
      Series3.AddXY(x, 0,'', col);
      Series3.AddXY(x, d,'', col);
      Series3.AddXY(x, 0,'', col);
    end;
    Series2.AddXY(tl, ft);
  end;
end;

// 初期設定
procedure TForm1.FormCreate(Sender: TObject);
begin
  memo1.Clear;
  memo1.Lines.Append('ワイブル分布計算');
  LabeledEdit4.EditLabel.Caption := '1 ≧ P ≧ 0' + #13#10 + '下側累積確率';
  Chart1.BackImage.Bitmap.Width := Chart1.Width;
  Chart1.BackImage.Bitmap.Height := Chart1.Height;
end;

end.

 
  download Weibull_Density.zip

各種プログラム計算例に戻る