<form>
<P>
Input probability matrix P
(P<sub>ij</sub>, transition probability from i to j.):
<BR>
<textarea id="TEXTAREA1" name="textin" rows="20" style="width:100%;">
0.6 0.4
0.3 0.7
</textarea>
<P>
<input onclick="b_clk(this.form)" type="button" value="calculate" name="b">
probability vector in stable state:
<BR>
<textarea name="textout" rows="10" style="width:100%;">
</textarea>
<P>
<input onclick="c_clk(this.form)" type="button" value="calculate" name="c">
<input type="text" size="3" value="2" name="textin2">
'th power of probability matrix
<BR>
<textarea name="textout2" rows="20" style="width:100%;"></textarea>
</form>
<script type="text/javascript">
<!--
function init()
{
//document.forms[0].textin.value="0.6 0.4\n0.3 0.7";
//document.forms[0].textin2.value="2";
}
function b_clk(form)
{
form.textout.value = markov(form.textin.value);
}
function c_clk(form)
{
form.textout2.value = mpower(form.textin.value, form.textin2.value);
}
function mpower(c, v)
{
var p=to_matrix(c);
var n=p.length;
var pp=new Array(n);
var sum=new Array(n);
var i,j,k,l;
for (i=0; i<n; i++) {
pp[i]=new Array(n);
sum[i]=new Array(n);
for (j=0; j<n; j++) {
pp[i][j]=p[i][j];
sum[i][j]=0;
}
}
for (l=1; l<v; l++) {
for (i=0; i<n; i++)
for (j=0; j<n; j++)
sum[i][j]=0;
for (i=0; i<n; i++)
for (j=0; j<n; j++)
for (k=0; k<n; k++)
sum[i][j]+=pp[i][k]*p[k][j];
for (i=0; i<n; i++)
for (j=0; j<n; j++)
pp[i][j]=sum[i][j];
}
return print2dmf(pp, 2)
}
function replaceall(str,c,cc)
{
while(str.indexOf(c) > -1)
str=str.replace(c,cc);
}
function to_matrix(c)
{
//obtain array p[][] from strings c
var i,j;
var cin=c;
replaceall(cin,"\t"," ");
replaceall(cin,","," ");
replaceall(cin," "," ");
var n=0;
var cl=cin.split("\n");
for (i=0; i<cl.length; i++) {
while(cl[i].indexOf(" ") == 0)
cl[i]=cl[i].replace(" ","");
//replaceall(cl[i],"\r","*");
//replaceall(cl[i],"\n","**");
//alert(cl[i]+cl[i].length);
if (cl[i].length <= 1)
break;
var cc=cl[i].split(" ");
n++;
//if (cc.length <= 0)
// break;
//n=i+1;
}
var p=new Array(n);
for (i=0; i<n; i++) {
p[i]=new Array(n);
var cc=cl[i].split(" ");
for (j=0; j<n; j++)
p[i][j]=Number(cc[j]);
}
return p;
}
function markov(c)
{
var i,j;
var p=to_matrix(c);
var n=p.length;
//alert("p=\n"+print2dm(p,n,n));
//add normalization condition
m=n+1;
var a=new Array(m);
for (i=0; i<m; i++) {
a[i]=new Array(m);
for (j=0; j<m; j++)
a[i][j]=0;
}
for (j=0; j<m; j++)
a[0][j]=1;
//copy transverse of p-1 to a
for (i=0; i<n; i++)
for (j=0; j<n; j++) {
if (i!=j)
a[i+1][j]=p[j][i];
else
a[i+1][j]=p[j][i]-1;
}
//alert("a=\n"+print2dm(a,m,m));
var f=new Array(n);
gaussj(a,n,f);
return print1dmf(f, 3);
}
function print1dm(a)
{
return print1dmf(a,-1);
}
function print1dmf(a, l)
{
//var res = "n=" + String(a.length) + "\n\n";
var i,j;
var res="";
for (i=0; i<a.length; i++)
res += String(i+1)+": " + pfmt(a[i],l)+"\n";
return res;
}
function print2dm(a)
{
return print2dmf(a,-1);
}
function print2dmf(a, l)
{
var i,j,k;
var res="";
for (i=0; i<a.length; i++) {
for (j=0; j<a[i].length; j++)
res += pfmt(a[i][j],l)+" ";
res += "\n";
}
return res;
}
function pfmt(v, l)
{
if (l<0)
return String(v);
var i;
var a=1;
for (i=0; i<l; i++)
a *= 10;
var s = String(Math.round(v*a)/a);
for (i=0; i<l+2-s.length; i++)
s += " ";
return s;
}
function gaussj(a,n,f)
{
var m=n+1;
var i,j,k;
//implicit pivoting
for (i=0; i<m; i++) {
amx=Math.abs(a[i][0]);
for (j=1; j<n; j++) {
if (amx < Math.abs(a[i][j]) )
amx=Math.abs(a[i][j]);
}
for (j=0; j<m; j++)
a[i][j] /= amx;
}
for (i=0; i<n; i++) {
//alert("i="+String(i));
//select pivot
if (i>0) {
var r=i;
for (k=i+1; k<m; k++) {
if ( Math.abs(a[r][i]) < Math.abs(a[k][i]) )
r=k;
}
//alert("piot="+r);
for (j=0; j<m; j++) {
t=a[i][j];
a[i][j]=a[r][j];
a[r][j]=t;
}
}
//normalize line i
var d = a[i][i];
for (j=i; j<m; j++)
a[i][j] /= d;
//alert("ai2=\n"+print2dm(a));
//subtract line i from k!=i.
for (k=0; k<m; k++) {
if(k != i) {
d=a[k][i];
for (j=i; j<m; j++)
a[k][j] -= d*a[i][j];
}
}
//alert("ai3=\n"+print2dm(a));
}
for (i=0; i<n; i++)
f[i]=a[i][m-1];
return;
}
//
-->
</script>
</P>