拉格朗日多项式

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace CsTest
{   //可以确定的是n个插值点的拉格朗日多项式的最大次数为n
    public class Ploy   //多项式
    {
        public double[] a;//系数,指数即索引值
        public Ploy(int n = 1)
        {
            a = new double[n]; //当未给数组中的每一项赋值时,其值为0
        }
        public static Ploy operator +(Ploy a1, Ploy b1)//多项式a1和b1的项数相同
        {
            Ploy p = new Ploy(a1.a.Length);
            for (int i = 0; i < a1.a.Length; i++)
            {
                p.a[i] = a1.a[i] + b1.a[i];//系数相加
            }
            return p;
        }
        public static Ploy operator *(Ploy a1, Ploy b1)
        {
            Ploy p = new Ploy(a1.a.Length);
            for (int i = 0; i < a1.a.Length; i++)
            {
                if (a1.a[i] == 0)
                {
                    continue;  //此项系数为0
                }
                for (int j = 0; j < a1.a.Length; j++)
                {
                    if (b1.a[j] == 0)//此项系数为0
                    {
                        continue;
                    }
                    if (i + j > a1.a.Length)
                    {
                        Console.WriteLine("运算出现错误");
                        break;
                    }
                    p.a[i + j] += a1.a[i] * b1.a[j];
                }
            }
            return p;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            int n = 4;
            //获取文件中的x值得数量并赋给n
            //int[] X = new int[n];  //横坐标数组
            //int[] Y = new int[n];  //纵坐标数组
            int[] X = { 0, 1, 2, 3 };
            int[] Y = { 2, -1, 4, 3 };
            Ploy lag = new Ploy(n);//拉格朗日多项式
            for (int i = 0; i < n; i++)
            {
                Ploy py = new Ploy(X.Length);
                py.a[0] = Y[i];
                Ploy px = new Ploy(X.Length);
                px.a[0] = 1;
                for (int k = 0; k < X.Length; k++)
                {
                    if (i != k)
                    {
                        px.a[0] *= X[i] - X[k];
                    }
                }
                py.a[0] /= px.a[0];
                Ploy mul = new Ploy(n);
                mul.a[0] = 1;
                for (int j = 0; j < n; j++)
                {
                    Ploy temp=new Ploy(n);
                    temp.a[1]=1;
                    Ploy temp2=new Ploy(n);
                    if(i==j)
                    {
                        continue;
                    }
                    temp2.a[0]=-X[j];
                    mul *= temp + temp2;
                }
                lag += py * mul;
            }
            //输出拉格朗日多项式
            for(int i=n-1;i>=0;i--)
            {
                if (lag.a[i] == 0)
                    continue;
                Console.Write("{0}x^{1}+",lag.a[i],i);
            }
        }
    }
}

原文地址:https://www.cnblogs.com/zztong/p/6695153.html