C#, Cálculo numérico: método de cálculo y programa fuente de la función de evaluación polinómica poli

 

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










    }
}
 

Supongo que te gusta

Origin blog.csdn.net/beijinghorn/article/details/132468317
Recomendado
Clasificación