In this example a nonlinear model is fitted. The derivatives are obtained by finite differences.
using System;
using Imsl.Math;
using Imsl.Stat;
public class NonlinearRegressionEx1 : NonlinearRegression.IFunction
{
public bool f(double[] theta, int iobs, double[] frq, double[] wt, double[] e)
{
double[] ydata =
new double[]{ 54.0, 50.0, 45.0, 37.0, 35.0,
25.0, 20.0, 16.0, 18.0, 13.0,
8.0, 11.0, 8.0, 4.0, 6.0};
double[] xdata =
new double[]{ 2.0, 5.0, 7.0, 10.0, 14.0,
19.0, 26.0, 31.0, 34.0, 38.0,
45.0, 52.0, 53.0, 60.0, 65.0};
bool iend;
int nobs = 15;
if (iobs < nobs)
{
wt[0] = 1.0;
frq[0] = 1.0;
iend = true;
e[0] = ydata[iobs] - theta[0] * Math.Exp(theta[1] * xdata[iobs]);
}
else
{
iend = false;
}
return iend;
}
public static void Main(String[] args)
{
int nparm = 2;
double[] theta = new double[]{60.0, - 0.03};
NonlinearRegression regression = new NonlinearRegression(nparm);
regression.Guess = theta;
NonlinearRegression.IFunction fcn = new NonlinearRegressionEx1();
double[] coef = regression.Solve(fcn);
Console.Out.WriteLine
("The computed regression coefficients are {" + coef[0] + ", "
+ coef[1] + "}");
Console.Out.WriteLine("The computed rank is " + regression.Rank);
Console.Out.WriteLine("The degrees of freedom for error are " +
regression.DFError);
Console.Out.WriteLine("The sums of squares for error is "
+ regression.GetSSE());
new PrintMatrix("R from the QR decomposition ").Print(regression.R);
}
}
The computed regression coefficients are {58.6065629318535, -0.039586447289031}
The computed rank is 2
The degrees of freedom for error are 13
The sums of squares for error is 49.459299862472
R from the QR decomposition
0 1
0 1.87385998175942 1139.92836180938
1 0 1139.79754530433
Link to C# source.