public Vector SolveBackwardSubstitution( Vector b )
{
if ( Rows != b.Size )
throw new Exception( "Can't solve!" );
if ( !IsUpperDiagonal )
throw new Exception( "Can't solve!" );
Vector R = new Vector( Rows );
R[Rows-1] = b[Rows-1] / m[Rows-1,Rows-1];
for ( int i=Rows-2; i >= 0; i-- )
{
double temp = 0.0;
for ( int k=i+1; k < Rows; k++ )
temp += R[k] * m[i,k];
double Div = m[i,i];
if ( Div != 0.0 )
R[i] = (b[i] - temp) / Div;
}
return R;
}