usando Sistema;
usando System.Text;
espacio de nombres Legalsoft.Truffer
{ /// <summary> /// operaciones sobre polinomios /// </summary> public class Poly { /// <summary> /// polinomio c[0]+c[1]x+c [2]x^2+ ... + c[n-2]x^n-2 + c[n-1]x^n-1 /// </summary> privado doble[] c { get; colocar; }
/// <summary>
/// Construir polinomio
/// </summary>
/// <param name="cc"></param>
public Poly(double[] cc)
{ this.c = cc; }
poli doble pública (doble x)
{ int j; doble p = c[j = c.Longitud - 1]; mientras (j > 0) { p = p * x + c[--j]; } devolver p; }
public String toString()
{ StringBuilder sb = nuevo StringBuilder(32); int j = c.Longitud - 1; sb.Append(String.Format("%fx^%d", c[j], j)); j--; for (; j != 0; j--) { sb.Append(String.Format("%+fx^%d", c[j], j)); } sb.Append(String.Format("%+f ", c[0])); devolver sb.ToString().Substring(0); }
/// <summary>
/// Construir polinomio desde raíces
/// </summary>
/// <param name="z"></param>
/// <returns></returns>
/// <excepción cref="Exception"></exception>
public static Poly buildFromRoots(Complex[] z)
{ for (int i = 0; i < z.Length; i++) { bool encontrado = false; for (int j = 0; j < z.Length; j++) { //if (z[i].re == z[j].re && z[i].im == -z[j].im ) if (Math.Abs(z[i].re - z[j].re) <= float.Epsilon && Math.
{ encontrado = verdadero; romper; } } if (!found) { throw new Exception("Las raíces deben ser conjugadas"); } }
Complejo[] c = nuevo Complejo[z.Longitud + 1];
c[0] = z[0].neg();
c[1] = nuevo Complejo(1, 0);
for (int i = 1; i < z.Longitud; i++)
{ Complejo d = c[0]; c[0] = c[0].mul(z[i].neg()); for (int j = 1; j < i + 1; j++) { Complejo dd = c[j]; c[j] = d.sub(z[i].mul(c[j])); d = dd; } c[yo + 1] = d; } doble[] cc = nuevo doble[c.Longitud]; for (int i = 0; i < cc.Longitud; i++) {
cc[i] = c[i].re;
}
devolver nuevo Poly(cc);
}
/// <summary>
/// Construir polinomio desde raíces
/// </summary>
/// <param name="z"></param>
/// <returns></returns>
public static Poly buildFromRoots( doble[] z)
{ doble[] c = nuevo doble[z.Longitud + 1]; c[0] = -z[0]; c[1] = 1; para (int i = 1; i < z. Longitud; i++) { doble d = c[0]; c[0] *= -z[i]; for (int j = 1; j < i + 1; j++) { doble dd = c[j]; c[j] = d - z[i] * c[j]; d = dd;
}
c[yo + 1] = d;
}
devolver nuevo Poly(c);
}
/// <summary>
/// Dados los coeficientes de un polinomio de grado nc como una matriz c[0..nc] de
/// tamaño nc+1 (siendo c[0] el término constante), y dado un valor x, esta
/// rutina llena una matriz de salida pd de tamaño nd+1 con el valor del
/// polinomio evaluado en x en pd[0], y las primeras nd derivadas en x en
/// pd[ 1..º].
/// </summary>
/// <param name="c"></param>
/// <param name="x"></param>
/// <param name="pd"></ param>
public static void ddpoly(doble[] c, doble x, doble[] pd)
{ int nc = c. Longitud - 1; int nd = pd.Longitud - 1;
doble cnst = 1,0;
pd[0] = c[nc];
for (int j = 1; j < nd + 1; j++)
{ pd[j] = 0,0; } for (int i = nc - 1; i >= 0; i--) { int nnd = (nd < (nc - i) ? nd : nc - i); for (int j = nnd; j > 0; j--) { pd[j] = pd[j] * x + pd[j - 1]; } pd[0] = pd[0] * x + c[i]; } for (int i = 2; i < nd + 1; i++) { cnst *= i; pd[i] *= cnst;
}
}
/// <summary>
/// Dados los coeficientes de un polinomio de grado nc como una matriz c[0..nc] de
/// tamaño nc+1 (siendo c[0] el término constante), y dado un valor x, esta
/// rutina llena una matriz de salida pd de tamaño nd+1 con el valor del
/// polinomio evaluado en x en pd[0], y las primeras nd derivadas en x en
/// pd[ 1..º].
/// </summary>
/// <param name="u"></param>
/// <param name="v"></param>
/// <param name="q"></ param>
/// <param name="r"></param>
/// <excepción cref="Exception"></exception>
public static void poldiv(doble[] u, doble[] v, doble[] q, doble[] r)
{ int n = u.Longitud - 1; int nv = v.Longitud - 1; // while (nv >= 0 && v[nv] == 0.0) while (nv >= 0 && Math.Abs(v[nv]) <= float.Epsilon) { nv--; } if (nv < 0) { throw new Exception ("poldiv divide por cero polinomio"); }
//r = u;
r = Globales.CopyFrom(u);
//q.assign(u.Longitud, 0.0);
for (int k = n - nv; k >= 0; k--)
{ q[k] = r[nv + k] / v[nv]; for (int j = nv + k - 1; j >= k; j--) { r[j] -= q[k] * v[j - k]; } } for (int j = nv; j <= n; j++) { r[j] = 0.0; } }
}
}