utilizando el sistema;
espacio de nombres Zhou.CSharp.Algorithm
{ delegado público double delFunction_x(doble x); delegado publico double delFunction_xa(doble[] x); delegado publico double delFunction_x_y(doble x, doble y); delegado público double delFunction_x_ya(doble x, doble[] y); delegado público doble delFunction_xa_ya(doble[] x, doble[] y);
/// <summary>
/// Class NLEquations para resolver ecuaciones no lineales
/// Original Zhou Changfa
/// Adaptado a una profunda confusión
/// </summary>
public static parcial class NLEquations
{ /// <summary> /// Método de bisección para encontrar raíces reales de ecuaciones no lineales /// </summary> /// <param name="Func">Calcular la función del extremo izquierdo de la ecuación double Func(double x)</param> /// <param name=" nNumRoots">El valor estimado del número de raíces reales en [xStart, xEnd]</param> /// <param name="x">Array unidimensional, la longitud es m. regresa en el intervalo [xStart,
/// <param name="eps">parámetro de control de precisión</param>
/// <return>int type, el número de raíces reales obtenidas</return>
public static int GetRootBisect(delFunction_x Func, int nNumRoots, double [ ] x, double xStart, double xEnd, double dblStep, double eps)
{ int n, js; double z, y, z1, y1, z0, y0;
// El número de raíces se borra a 0
n = 0;
// busca desde el extremo izquierdo
z = xStart,
y = Func(z);
// 循环求解
while ((z <= xEnd + dblStep / 2.0) && (n != nNumRoots))
{ if (Math.Abs(y) < eps) { n = n + 1; x[n - 1] = z; z = z + dblPaso / 2.0; y = Func(z); } else { z1 = z + dblStep; y1 = Func(z1);
if (Math.Abs(y1) <eps)
{ n = n + 1; x[n - 1] = z1; z = z1 + dblPaso / 2.0; y = Func(z); } más si (y * y1 > 0.0) { y = y1; z = z1; } más { js = 0; while (js == 0) { if (Math.Abs(z1 - z) <eps)
{ norte = norte + 1; x[n - 1] = (z1 + z) / 2.0; z = z1 + dblPaso / 2.0; y = Func(z); js = 1; } más { z0 = (z1 + z) / 2.0; y0 = Func(z0); if (Math.Abs(y0) < eps) { x[n] = z0; n = n + 1;
js = 1;
z = z0 + dblPaso / 2.0;
y = Func(z);
}
más si ((y * y0) < 0.0)
{ z1 = z0; y1 = y0; } más { z = z0; y = y0; } }
}
} }
}
// Devuelve el número de raíces reales
return (n);
}
}
}