using System;
namespace Science.Mathematics.IntegralEquation
{
///
/// InhomogeneousVolterraEquationSecondKind
///
public class InhomogeneousVolterraEquationSecondKind
{
public InhomogeneousVolterraEquationSecondKind()
{
}
private Function.ToLastType kp;
private Function.ToLastType gp;
public Function.ToLastType Kernel
{
set { kp = value; }
}
public Function.ToLastType KernelFunction
{
set { gp = value; }
}
private int n,m;
public int NumberOfSteps
{
get{return n;}
set{n=value;}
}
public int NumberOfCoupledFunctions
{
get{return m;}
set{m=value;}
}
private double from,h;
public double From
{
get{return from;}
set{from=value;}
}
public double StepSize
{
get{return h;}
set{h=value;}
}
private double[] t;
private double[,] f;
Voltra obj = new Voltra();
public void Solve()
{
obj.voltra(m, n, from, h, gp, kp);
t = obj.T;
f = obj.F;
}
public double[] At
{
get{return t;}
}
public double[,] Solution
{
get{return f;}
}
}
//private class
class Voltra
{
public Voltra()
{
}
private double[] t;
private double[,] f;
public double[] T
{
get { return t; }
}
public double[,] F
{
get { return f; }
}
public void voltra(int m, int n, double t0, double h,
Function.ToLastType g,
Function.ToLastType ak)
{
t = new double[n];
f = new double[m, n];
double[,] a = new double[m, m];
double[] b = new double[m];
t[0] = t0;
for (int k = 0; k < m; k++) f[k, 0] = g(k, t[0]);
for (int i = 1; i < n; i++)
{
t[i] = t[i - 1] + h;
for (int k = 0; k < m; k++)
{
double sum = g(k, t[i]);
for (int l = 0; l < m; l++)
{
sum += 0.5 * h * ak(k, l, t[i], t[0]) * f[l, 0];
for (int j = 1; j < i; j++)
sum += h * ak(k, l, t[i], t[j]) * f[l, j];
if (k == l) a[k, l] = 1.0 - 0.5 * h * ak(k, l, t[i], t[i]);
else a[k, l] = -0.5 * h * ak(k, l, t[i], t[i]);
}
b[k] = sum;
}
LUdcmp obj = new LUdcmp(a);
obj.solve(b, b);
for (int k = 0; k < m; k++) f[k, i] = b[k];
}
}
}
}