オッズ シェアの計算方法 | TigerOddsの最終レース日記

TigerOddsの最終レース日記

競馬ソフト「GoGyo」の機能で競馬を考える。


テーマ:

前回のシェアの計算式から

(1)より、W1={26.26-0.246(Wm+Wn)}/{Omax(1)-0.592} ........(5)
(2)より、W2={26.26-0.246(Wm+Wn)}/{Omax(2)-0.592} ........(6)
(3)より、Wm={26.26-0.246(W1+W2)}/{Omin(m)-0.592} ........(7)
(4)より、Wn={26.26-0.246(W1+W2)}/{Omin(n)-0.592} ........(8)

で、オッズは分かっているので、未知数が4つ、式が4つだから、この連立方程式は解ける。

消去、代入で解けるがややこしいし、他の場合もあるので、出走馬最大18頭分を行うなら、

コンピュータープログラミングで18次の連立方程式を解けば楽かもしれない。

そこで連立方程式を解く方法をインターネットで調べてガウス-ジョルダンの解法 でやってみることにする。

/////////////////////////////////////////////////////////////////

//連立方程式ガウス-ジョルダンの解法 Delphi

//n次方程式 aは係数を表すn次元配列
//bは非同次項を表す1次配列
//戻りは 逆行列がaに  解がbに入る

//type TGaussA=array[1..18,1..18] of real;//18は最大出走頭数
//type TGaussB=array[1..18] of real;//18は最大出走頭数

/////////////////////////////////////////////////////////////////
function gauss_jordan(n:integer;var a:TGaussA; var b:TGaussB):integer;
var
ipv,i,j:integer; inv_pivot,temp:real;
big:real; pivot_row:integer;
row:array[1..18] of integer;
begin
for ipv:=1 to n do begin

//最大値検索
big:=0.0;
for i:=ipv to n do begin
if abs(a[i,ipv])>big then begin big:=abs(a[i,ipv]);pivot_row:=i;end;
end;//for i
if big=0 then begin result:=0;break;end;
row[ipv]:=pivot_row;

//行の入れ替え
if (ipv<>pivot_row) then begin
for i:=1 to n do begin temp:=a[ipv,i];a[ipv,i]:=a[pivot_row,i];a[pivot_row,i]:=temp;end;
temp:=b[ipv];b[ipv]:=b[pivot_row];b[pivot_row]:=temp;
end;//
///対角成分=1 ピボット行の処理
inv_pivot:=1.0/a[ipv,ipv];
a[ipv,ipv]:=1.0;
for j:=1 to n do begin a[ipv,j]:=a[ipv,j]*inv_pivot;end;//for j
b[ipv]:=b[ipv]*inv_pivot;

///ピボット列=0 ピボット行以外ノ処理
for i:=1 to n do begin
if (i<>ipv) then begin
temp:=a[i,ipv];a[i,ipv]:=0.0;
for j:=1 to n do begin a[i,j]:=a[i,j]-temp*a[ipv,j];end;//for
b[i]:=b[i]-temp*b[ipv];
end;
end;
end;//for ipv

//列の入れ替え(逆行列)
for j:=n downto 1 do begin
if (j<>row[j]) then begin
for i:=1 to n do begin temp:=a[i,j];a[i,j]:=a[i,row[j]];a[i,row[j]]:=temp;end;
end;
end;

result:=1;
end;

/////////////////////////////////////////////////////////////////

//ガウス-ジョルダンの解法 Delphi 終了

/////////////////////////////////////////////////////////////////

(5)(6)(7)(8)を変形して、係数を求め、aの配列に格納、bの配列には非同次項

とはなんだろうか?定数のことらしい。定数を代入してあとは解がbの配列に

戻ってくるので、これでシェアが分かるはずだ。

関数gauss_jordan()の使い方は

3X+2y+z=10

7x+8y+9z=50

x+y+2Z=9

の場合

var a:TGaussA; b:TGaussB;
begin
a[1,1]:=3;a[1,2]:=2;a[1,3]:=1;b[1]:=10;
a[2,1]:=7;a[2,2]:=8;a[2,3]:=9;b[2]:=50;
a[3,1]:=1;a[3,2]:=1;a[3,3]:=2;b[3]:=9;

gauss_jordan(3,a,b);
showmessage('x='+floattostr(b[1])+' y='+floattostr(b[2])+' z='+floattostr(b[3]));
end;

注意するのはa[]の配列でa[行,列]で係数を入力する。



tigeroddsさんをフォロー

ブログの更新情報が受け取れて、アクセスが簡単になります

Ameba人気のブログ

Amebaトピックス