package jass.utils;
/** Implement Thomas alg. forthe solution of tridiagonal linear systems.
@author Kees van den Doel (kvdoel@cs.ubc.ca)
*/
public class ThomasAlg {
/**
Solve tridiagonal system
a(i)x(i-1) + b(i)x(i) + c(i)x(i+1) = d(i), i = 0,..,n-1
a(0) = 0 and c(n-1) = 0. (Note that x(-1) and x(n) are unused.)
d holds the solution, b is modified.
Return false if there is a problem.
*/
public static final boolean thomas(double[] a, double[] b, double[] c, double[] d, int n) {
for(int i=1;i<n;i++) {
if(b[i-1]==0) {
return false;
}
double m = a[i]/b[i-1];
b[i] -= m*c[i-1];
d[i] -= m*d[i-1];
}
d[n-1] = d[n-1]/b[n-1];
for(int i=n-2;i>=0;i--) {
d[i]=(d[i]-c[i]*d[i+1])/b[i];
}
return true;
}
}
class ThomasTest {
public static void main(String[] argv) {
int n=10;
double[] a = new double[n];
double[] b = new double[n];
double[] bb = new double[n];
double[] c = new double[n];
double[] d = new double[n];
double[] dd = new double[n];
for(int i=0;i<n;i++) {
a[i] = Math.random()-.5;
b[i] = Math.random()-.5;
bb[i] = b[i];
c[i] = Math.random()-.5;
d[i] = Math.random()-.5;
dd[i] = d[i];
}
a[0] = 0;
c[n-1]=0;
boolean ret = ThomasAlg.thomas(a,b,c,d,n);
if(!ret) {
System.out.println("error");
}
double res;
int i=0;
res = bb[i]*d[i]+c[i]*d[i+1] -dd[i];
System.out.println(res);
for(i=1;i<n-1;i++) {
res = a[i]*d[i-1]+bb[i]*d[i]+c[i]*d[i+1] -dd[i];
System.out.println(res);
}
i=n-1;
res = a[i]*d[i-1]+bb[i]*d[i] -dd[i];
System.out.println(res);
}
}