private double[] gradient(double[] x)
{
double[] g = new double[x.Length];
for (int i = 0; i < x.Length; i++)
{
// Calculate quadratic terms
g[i] = 2.0 * x[i] * QuadraticTerms[i, i];
for (int j = 0; j < x.Length; j++)
if (i != j) g[i] += x[j] * (QuadraticTerms[i, j] + QuadraticTerms[j, i]);
// Calculate for linear terms
g[i] += LinearTerms[i];
}
return g;
}
}