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]; } } } }