精华内容
下载资源
问答
  • Java多项式函数拟合的实现方法

    千次阅读 2020-08-27 20:51:27
    多项式函数是一个很重要的建模手段,利用任意个点,就可以拟合出一个多项式函数,通过多项式函数来推导出其他点的函数值,然后绘制出函数曲线,这个是最基本的原理,非常简单! 拟合方法 通过点来拟合,得到拟合...

    介绍

    项目中遇到给出几个间隔时间点的数据,然后判断其他时刻的数据,需要整体考虑数据的变化趋势,不能通过插值来得到中间未知时刻的数据,所以需要使用多项式拟合来将数据补全。

    多项式函数是一个很重要的建模手段,利用任意个点,就可以拟合出一个多项式函数,通过多项式函数来推导出其他点的函数值,然后绘制出函数曲线,这个是最基本的原理!

    拟合方法

    1. 通过点来拟合,得到拟合多项式的函数关系;
    2. 将得到的集合关系转化成多项式函数的表达式,形如xxx + axx + b*x +c 的样子;
    3. 将多项式函数表达式,解析成一个计算方法;
    4. 通过计算方法,来得到任意x(横坐标)对应的y(纵坐标)的值。

    下面是用Java语言来实现多项式拟合的代码:

    Java实现

    拟合功能在下面代码中,已完整实现,可直接使用。

    坐标实体类

    定义坐标点的类,x(横坐标),y(纵坐标)

    package cn.com.em.pu.fitting;
    
    import java.io.Serializable;
    import java.util.Objects;
    
    /**
     * 坐标点
     *
     * @author pupengfei
     * @version 1.0
     * @date 2020/8/27 14:45
     */
    public class Point implements Serializable {
    
        private static final long serialVersionUID = 3256087124347421878L;
    
        private double x;
    
        private double y;
    
        public Point() {
        }
    
        public Point(double x, double y) {
            this.x = x;
            this.y = y;
        }
    
    
        public double getX() {
            return x;
        }
    
        public void setX(double x) {
            this.x = x;
        }
    
        public double getY() {
            return y;
        }
    
        public void setY(double y) {
            this.y = y;
        }
    
        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            Point point = (Point) o;
            return Double.compare(point.x, x) == 0 &&
                    Double.compare(point.y, y) == 0;
        }
    
        @Override
        public int hashCode() {
            return Objects.hash(x, y);
        }
    
        @Override
        public String toString() {
            return "Point{" +
                    "x=" + x +
                    ", y=" + y +
                    '}';
        }
    }
    
    

    自定义异常

    package cn.com.em.pu.fitting;
    
    /**
     * 多项式拟合异常
     *
     * @author pupengfei
     * @version 1.0
     * @date 2020/8/27 15:29
     */
    public class PolynomialFittingException extends Exception {
    
        public PolynomialFittingException() {
        }
    
        public PolynomialFittingException(String message) {
            super(message);
        }
    
        public PolynomialFittingException(String message, Throwable cause) {
            super(message, cause);
        }
    }
    
    

    多项式计算公式接口

    多项式计算公式,只有一个方法,根据x获取y的值

    package cn.com.em.pu.fitting;
    
    /**
     * 多项式计算公式,根据x获取y的值
     *
     * @author pupengfei
     * @version 1.0
     * @date 2020/8/27 13:57
     */
    @FunctionalInterface
    public interface PolynomialFnc {
    
        /**
         * 根据横坐标x,计算纵坐标y的值
         * @param x 横坐标
         * @return y,纵坐标
         */
        double getY(double x);
    
    }
    
    

    多项式拟合工具类

    数据多项式拟合工具类

    package cn.com.em.pu.fitting;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 数据多项式拟合工具类
     *
     * @author pupengfei
     * @version 1.0
     * @date 2020/8/27 13:56
     */
    public class PolynomialUtil {
    
        /**
         * 多项式拟合
         * @param data 坐标点集合
         * @return 多项式计算公式
         */
        public static PolynomialFnc fitting(List<Point> data) throws PolynomialFittingException {
            // 多项式每一项的计算表达式字符串
            List<String> returnResult = new ArrayList<>();
    
            int n = data.size();
    
            List<List<Double>> inputMatrix = new ArrayList<>();
    
            for (int i = 0; i < n; i++) {
                List<Double> tempArr = new ArrayList<>();
                for (int j = 0; j < n; j++) {
                    tempArr.add(Math.pow(data.get(i).getX(), n - j - 1));
                }
    
                tempArr.add(data.get(i).getY());
                inputMatrix.add(tempArr);
            }
    
            for (int i = 0; i < n; i++) {
                double base = inputMatrix.get(i).get(i);
                for (int j = 0; j < n + 1; j++) {
                    if (base == 0) {
                        //存在相同x不同y的点,无法使用多项式进行拟合
                        throw new PolynomialFittingException("存在相同x不同y的点,无法使用多项式进行拟合");
                    }
                    inputMatrix.get(i).set(j, inputMatrix.get(i).get(j) / base);
                }
                for (int j = 0; j < n; j++) {
                    if (i != j) {
                        double baseInner = inputMatrix.get(j).get(i);
                        for (int k = 0; k < n + 1; k++) {
                            inputMatrix.get(j).set(k, inputMatrix.get(j).get(k) - baseInner * inputMatrix.get(i).get(k));
                        }
                    }
                }
            }
            for (int i = 0; i < n; i++) {
                if (inputMatrix.get(i).get(n) > 0) {
                    returnResult.add("+");
                }
    
                if (inputMatrix.get(i).get(n) != 0) {
                    String tmp_x = "";
                    for (int j = 0; j < n - 1 - i; j++) {
                        tmp_x = tmp_x + "*x";
                    }
                    returnResult.add((inputMatrix.get(i).get(n) + tmp_x));
                }
            }
    
            // 将多项式表达式,转换为计算公式
            return x -> {
                double y = 0;
                for (String s : returnResult) {
                    if ("+".equals(s)) {
                        y += 0;
                    } else if (s.contains("*")) {
                        String[] split = s.split("\\*");
                        double temp = 1;
                        for (String s1 : split) {
                            if ("x".equals(s1)) {
                                temp *= x;
                            } else {
                                temp *= Double.parseDouble(s1);
                            }
                        }
                        y += temp;
                    } else {
                        y += Double.parseDouble(s);
                    }
                }
    
                return y;
            };
        }
    
    }
    
    

    演示代码

    package cn.com.em.pu.fitting;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 测试
     *
     * @author pupengfei
     * @version 1.0
     * @date 2020/8/27 20:18
     */
    public class TestExample {
    
        public static void main(String[] args) throws PolynomialFittingException {
            List<Point> data = new ArrayList<>();
            data.add(new Point(1, 1));
            data.add(new Point(2, 2));
            data.add(new Point(3, 2));
            data.add(new Point(4, 1));
            PolynomialFnc fitting = PolynomialUtil.fitting(data);
            System.out.println(fitting.getY(3));
    
            data = new ArrayList<>();
            data.add(new Point(1, 1));
            data.add(new Point(2, 3));
            fitting = PolynomialUtil.fitting(data);
            System.out.println(fitting.getY(3));
        }
    
    }
    
    

    Jar包下载

    下载地址

    展开全文
  • 文章目录多元多项式**n** 元多项式概念n元多项式n元多项式环nnn 元多项式的字典排列法有关性质齐次多项式nnn 元多项式函数对称多项式一元多项式根与系数的关系nnn 元对称多项式例1例2 \quad一 元多项式的判别式例3...

    多元多项式

    n 元多项式概念

    n元多项式

    P \boldsymbol{P} P 为一个数域, x 1 , x 2 , ⋯   , x n \boldsymbol{x}_{\mathbf{1}}, \boldsymbol{x}_{\mathbf{2}}, \cdots, \boldsymbol{x}_{n} x1,x2,,xn n \boldsymbol{n} n 个文字, 形式
    a x 1 k 1 x 2 k 2 ⋯ x n k n , a ∈ P , k i ∈ Z + , i = 1 , 2 , ⋯   , n a x_{1}^{k_{1}} x_{2}^{k_{2}} \cdots x_{n}^{k_{n}}, \quad a \in P, \quad k_{i} \in Z^{+}, i=1,2, \cdots, n ax1k1x2k2xnkn,aP,kiZ+,i=1,2,,n
    称为数域 P \boldsymbol{P} P 上的一个单项式;

    a ≠ 0 a \neq 0 a=0 时,称此单项式中各文字的指数之和 k 1 + k 2 + ⋯ + k n \boldsymbol{k}_{\mathbf{1}}+\boldsymbol{k}_{2}+\cdots+\boldsymbol{k}_{n} k1+k2++kn 为这个单项式的次数 ; \boldsymbol{;} ;

    如果两单项式中相同文字的指数对应相等,则称它们为同类项;

    有限个单项式的和
    f ( x 1 , x 2 , ⋯   , x n ) = ∑ k 1 k 2 ⋯ k n a k 1 k 2 ⋯ k n x 1 k 1 x 2 k 2 ⋯ x n k n f\left(x_{1}, x_{2}, \cdots, x_{n}\right)=\sum_{k_{1} k_{2} \cdots k_{n}} a_{{k_{1} k_{2} \cdots k_{n}} }x_{1}^{k_{1}} x_{2}^{k_{2}} \cdots x_{n}^{k_{n}} f(x1,x2,,xn)=k1k2knak1k2knx1k1x2k2xnkn
    称为数域 P \boldsymbol{P} P 上的一个 n n n 元多项式。

    n n n 元多项式中系数不为零的单项式的最高次数称为这个多项式的次数.

    n元多项式环

    数域 P P P 上关于文字 x 1 , x 2 , ⋯   , x n x_{1}, x_{2}, \cdots, x_{n} x1,x2,,xn 的全体 n n n 元多项式的集合称为数域 P \boldsymbol{P} P 上的 n n n 元多项式环,记作

    P [ x 1 , x 2 , ⋯   , x n ] P\left[x_{1}, x_{2}, \cdots, x_{n}\right] P[x1,x2,,xn]

    n n n 元多项式的字典排列法

    任取n元多项式
    f ( x 1 , x 2 , ⋯   , x n ) = ∑ k 1 k 2 ⋯ k n a k 1 k 2 ⋯ k n x 1 k 1 x 2 k 2 ⋯ x n k n (1) f\left(x_{1}, x_{2}, \cdots, x_{n}\right)=\sum_{k_{1} k_{2} \cdots k_{n}} a_{k_{1} k_{2} \cdots k_{n}} x_{1}^{k_{1}} x_{2}^{k_{2}} \cdots x_{n}^{k_{n}}\tag{1} f(x1,x2,,xn)=k1k2knak1k2knx1k1x2k2xnkn(1)
    中的两个单项式
    a x 1 k 1 x 2 k 2 ⋯ x n k n , b x 1 l 1 x 2 l 2 ⋯ x n l n \boldsymbol{a} \boldsymbol{x}_{1}^{k_{1}} \boldsymbol{x}_{2}^{k_{2}} \cdots \boldsymbol{x}_{n}^{k_{n}}, \quad \boldsymbol{b} \boldsymbol{x}_{1}^{l_{1}} \boldsymbol{x}_{2}^{l_{2}} \cdots \boldsymbol{x}_{n}^{l_{n}} ax1k1x2k2xnkn,bx1l1x2l2xnln
    若有某个 1 ≤ i ≤ n , 1 \leq i \leq n, 1in, 使
    k 1 − l 1 = k 2 − l 2 = ⋯ = k i − 1 − l i − 1 = 0 , k i − l i > 0 k_{1}-l_{1}=k_{2}-l_{2}=\cdots=k_{i-1}-l_{i-1}=0, \quad k_{i}-l_{i}>0 k1l1=k2l2==ki1li1=0,kili>0
    (此时也称数组 ( k 1 , k 2 , ⋯   , k n ) \left(k_{1}, k_{2}, \cdots, k_{n}\right) (k1,k2,,kn) 先于 ( l 1 , l 2 , ⋯   , l n ) , \left(l_{1}, l_{2}, \cdots, l_{n}\right), (l1,l2,,ln), 记作
    ( k 1 , k 2 , ⋯   , k n ) > ( l 1 , l 2 , ⋯   , l n ) \left(k_{1}, k_{2}, \cdots, k_{n}\right)>\left(l_{1}, l_{2}, \cdots, l_{n}\right) (k1,k2,,kn)>(l1,l2,,ln)
    则在多项式(1)中,把单项式 a x 1 k 1 x 2 k 2 ⋯ x n k n a x_{1}^{k_{1}} x_{2}^{k_{2}} \cdots x_{n}^{k_{n}} ax1k1x2k2xnkn 写在 b x 1 l 1 x 2 l 2 ⋯ x n l n b x_{1}^{l_{1}} x_{2}^{l_{2}} \cdots x_{n}^{l_{n}} bx1l1x2l2xnln 的前面. 将n元多项式中各单项式按这种先后次序排列的方法称为字典排列法.

    当n=1时,字典排列法即为降幕排列法.

    按字典排列法写出的第一个系数不为零的单项式称为多项式的首项.

    注 意 : \Large\color{violet}{注意:}
    多元多项式的首项未是最高次项.例如,
      f ( x 1 , x 2 , x 3 ) = 2 x 1 x 2 2 x 3 2 + x 1 2 x 2 + x 1 3 = x 1 3 + x 1 2 x 2 + 2 x 1 x 2 2 x 3 2 \begin{array}{l} \text { } \begin{aligned} f\left(x_{1}, x_{2}, x_{3}\right) &=2 x_{1} x_{2}^{2} x_{3}^{2}+x_{1}^{2} x_{2}+x_{1}^{3} \\ =& x_{1}^{3}+x_{1}^{2} x_{2}+2 x_{1} x_{2}^{2} x_{3}^{2} \end{aligned} \end{array}  f(x1,x2,x3)==2x1x22x32+x12x2+x13x13+x12x2+2x1x22x32
    f f f 的次数为5, 首项为 x 1 3 . x_{1}^{3} . x13.

    有关性质

    定 理 \large\color{magenta}{\boxed{\color{brown}{定理} }} f ( x 1 , ⋯   , x n ) ≠ 0 , g ( x 1 , ⋯   , x n ) ≠ 0 f\left(x_{1}, \cdots, x_{n}\right) \neq 0, \quad g\left(x_{1}, \cdots, x_{n}\right) \neq 0 f(x1,,xn)=0,g(x1,,xn)=0 时,积 f ( x 1 , ⋯   , x n ) g ( x 1 , ⋯   , x n ) f\left(x_{1}, \cdots, x_{n}\right) g\left(x_{1}, \cdots, x_{n}\right) f(x1,,xn)g(x1,,xn) 的首项等于 f ( x 1 , ⋯   , x n ) f\left(x_{1}, \cdots, x_{n}\right) f(x1,,xn)的首项与 g ( x 1 , ⋯   , x n ) g\left(x_{1}, \cdots, x_{n}\right) g(x1,,xn) 的首项的积.

    推 论 1 \large\color{magenta}{\boxed{\color{brown}{推论1} }} 1 f i ( x 1 , ⋯   , x n ) ≠ 0 , i = 1 , 2 , ⋯   , m , f_{i}\left(x_{1}, \cdots, x_{n}\right) \neq \mathbf{0}, \quad i=1,2, \cdots, m, fi(x1,,xn)=0,i=1,2,,m, 则积 f 1 f 2 ⋯ f m f_{1} f_{2} \cdots f_{m} f1f2fm 的首项等于 f 1 , f 2 , ⋯   , f m f_{1}, f_{2}, \cdots, f_{m} f1,f2,,fm 的首项的积.

    推 论 2 \large\color{magenta}{\boxed{\color{brown}{推论2} }} 2 f ( x 1 , ⋯   , x n ) ≠ 0 , g ( x 1 , ⋯   , x n ) ≠ 0 , f\left(x_{1}, \cdots, x_{n}\right) \neq 0, \quad g\left(x_{1}, \cdots, x_{n}\right) \neq 0, f(x1,,xn)=0,g(x1,,xn)=0, f ( x 1 , ⋯   , x n ) g ( x 1 , ⋯   , x n ) ≠ 0 f\left(x_{1}, \cdots, x_{n}\right) g\left(x_{1}, \cdots, x_{n}\right) \neq 0 f(x1,,xn)g(x1,,xn)=0

    齐次多项式

    定 义 \large\color{magenta}{\boxed{\color{brown}{定义} }} \quad 若多项式
    f ( x 1 , x 2 , ⋯   , x n ) = ∑ k 1 , k 2 ⋯ k n a k 1 , k 2 ⋯ k n x 1 k 1 x 2 k 2 ⋯ x n k n f\left(x_{1}, x_{2}, \cdots, x_{n}\right)=\sum_{k_{1}, k_{2} \cdots k_{n}} a_{k_{1}, k_{2} \cdots k_{n}} x_{1}^{k_{1}} x_{2}^{k_{2}} \cdots x_{n}^{k_{n}} f(x1,x2,,xn)=k1,k2knak1,k2knx1k1x2k2xnkn
    中每个单项式全是m次的,则称 f ( x 1 , x 2 , ⋯   , x n ) f\left(x_{1}, x_{2}, \cdots, x_{n}\right) f(x1,x2,,xn)为m次齐次多项式.

    性质

    1. 两个齐次多项式的积仍然是齐次多项式;积的次数等于这两个齐次多项式的次数之和.

    2. 任一 m \boldsymbol{m} m 次多项式 f ( x 1 , ⋯   , x n ) \boldsymbol{f}\left(x_{\mathbf{1}}, \cdots, \boldsymbol{x}_{\boldsymbol{n}}\right) f(x1,,xn) 都可唯一地表成
      f ( x 1 , ⋯   , x n ) = ∑ i = 1 m f i ( x 1 , ⋯   , x n ) f\left(x_{1}, \cdots, x_{n}\right)=\sum_{i=1}^{m} f_{i}\left(x_{1}, \cdots, x_{n}\right) f(x1,,xn)=i=1mfi(x1,,xn)
      其中 f i ( x 1 , ⋯   , x n ) f_{i}\left(x_{1}, \cdots, x_{n}\right) fi(x1,,xn) i i i 次齐次多项式,称之为 f ( x 1 , ⋯   , x n ) f\left(x_{1}, \cdots, x_{n}\right) f(x1,,xn) i i i 次齐次成分.

    3. f ( x 1 , ⋯   , x n ) = ∑ i = 1 m f i ( x 1 , ⋯   , x n ) f\left(x_{1}, \cdots, x_{n}\right)=\sum_{i=1}^{m} f_{i}\left(x_{1}, \cdots, x_{n}\right) f(x1,,xn)=i=1mfi(x1,,xn)
      g ( x 1 , ⋯   , x n ) = ∑ i = 1 l g i ( x 1 , ⋯   , x n ) g\left(x_{1}, \cdots, x_{n}\right)=\sum_{i=1}^{l} g_{i}\left(x_{1}, \cdots, x_{n}\right) g(x1,,xn)=i=1lgi(x1,,xn)
      则积 h ( x 1 , ⋯   , x n ) = f ( x 1 , ⋯   , x n ) g ( x 1 , ⋯   , x n ) \quad h\left(x_{1}, \cdots, x_{n}\right)=f\left(x_{1}, \cdots, x_{n}\right) g\left(x_{1}, \cdots, x_{n}\right) h(x1,,xn)=f(x1,,xn)g(x1,,xn) k k k 次齐次成分为
      h k ( x 1 , ⋯   , x n ) = ∑ i + j = k f i ( x 1 , ⋯   , x n ) g j ( x 1 , ⋯   , x n ) h_{k}\left(x_{1}, \cdots, x_{n}\right)=\sum_{i+j=k} f_{i}\left(x_{1}, \cdots, x_{n}\right) g_{j}\left(x_{1}, \cdots, x_{n}\right) hk(x1,,xn)=i+j=kfi(x1,,xn)gj(x1,,xn)
      特别地, h m + l ( x 1 , ⋯   , x n ) = f m ( x 1 , ⋯   , x n ) g l ( x 1 , ⋯   , x n ) \boldsymbol{h}_{m+l}\left(x_{1}, \cdots, x_{n}\right)=f_{m}\left(x_{1}, \cdots, x_{n}\right) g_{l}\left(x_{1}, \cdots, x_{n}\right) hm+l(x1,,xn)=fm(x1,,xn)gl(x1,,xn)

    4. 积的次数=因子的次数之和.

    n n n 元多项式函数

    与一元多项式一样我们可以定义n元多项式函数、函数值等概念.

    对称多项式

    一元多项式根与系数的关系

    韦 达 定 理 \large\color{magenta}{\boxed{\color{brown}{韦达定理} }}
    f ( x ) = x n + a 1 x n − 1 + a 2 x n − 2 + ⋯ + a n ∈ P [ x ] (2) f(x)=x^{n}+a_{1} x^{n-1}+a_{2} x^{n-2}+\cdots+a_{n} \in P[x] \tag{2} f(x)=xn+a1xn1+a2xn2++anP[x](2)

    f ( x ) f(x) f(x) P P P 上有 n n n 个根 α 1 , α 2 , ⋯   , α n \alpha_{1}, \alpha_{2}, \cdots, \alpha_{n} α1,α2,,αn
    f ( x ) = ( x − α 1 ) ( x − α 2 ) ⋯ ( x − α n ) (3) f(x)=\left(x-\alpha_{1}\right)\left(x-\alpha_{2}\right) \cdots\left(x-\alpha_{n}\right)\tag{3} f(x)=(xα1)(xα2)(xαn)(3)
    把(3)展开,与(2)比较,即得根与系数的关系:
    { − a 1 = α 1 + α 2 + ⋯ + α n a 2 = α 1 α 2 + α 1 α 3 + ⋯ + α n − 1 α n ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ( − 1 ) i a i = ∑ α k 1 α k 2 ⋯ α k i (  所有可能的  i  个不同的  a k j  的积之和  ) ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ( − 1 ) n a n = α 1 α 2 ⋯ α n \left\{\begin{array}{l} -a_{1}=\alpha_{1}+\alpha_{2}+\cdots+\alpha_{n} \\ a_{2}=\alpha_{1} \alpha_{2}+\alpha_{1} \alpha_{3}+\cdots+\alpha_{n-1} \alpha_{n} \\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \cdots \\ (-1)^{i} a_{i}=\sum \alpha_{k_{1}} \alpha_{k_{2}} \cdots \alpha_{k_{i}} \quad\left(\text { 所有可能的 } i \text { 个不同的 } a_{k_{j}} \text { 的积之和 }\right) \\ \cdots \cdots \cdots \cdots \cdots \cdots \cdots \\ (-1)^{n} a_{n}=\alpha_{1} \alpha_{2} \cdots \alpha_{n} \end{array}\right. a1=α1+α2++αna2=α1α2+α1α3++αn1αn(1)iai=αk1αk2αki( 所有可能的 i 个不同的 akj 的积之和 )(1)nan=α1α2αn
    特别地 a x 2 + b x + c = 0 ( a ≠ 0 ) , x 1 , x 2 a x^{2}+b x+c=0 \quad(a \neq 0), x_{1}, x_{2} ax2+bx+c=0(a=0),x1,x2 为其根
    则有 x 1 + x 2 = − b a , x 1 x 2 = c a \quad x_{1}+x_{2}=-\frac{b}{a}, \quad x_{1} x_{2}=\frac{c}{a} x1+x2=ab,x1x2=ac

    n n n 元对称多项式

    定 义 \large\color{magenta}{\boxed{\color{brown}{定义} }} \quad f ( x 1 , ⋯   , x n ) ∈ P [ x 1 , x 2 , ⋯   , x n ] f\left(x_{1}, \cdots, x_{n}\right) \in P\left[x_{1}, x_{2}, \cdots, x_{n}\right] f(x1,,xn)P[x1,x2,,xn],若对任意 i , j ( 1 ≤ i , j ≤ n ) i, \boldsymbol{j}(1 \leq i, j \leq n) i,j(1i,jn)
    f ( x 1 , ⋯   , x i , ⋯   , x j , ⋯   , x n ) = f ( x 1 , ⋯   , x j , ⋯   , x i , ⋯   , x n ) f\left(x_{1}, \cdots, x_{i}, \cdots, x_{j}, \cdots, x_{n}\right)=f\left(x_{1}, \cdots, x_{j}, \cdots, x_{i}, \cdots, x_{n}\right) f(x1,,xi,,xj,,xn)=f(x1,,xj,,xi,,xn)
    则称该多项式为对称多项式.

    如, f ( x 1 , x 2 , x 3 ) = x 1 3 + x 2 3 + x 3 3 \quad f\left(x_{1}, x_{2}, x_{3}\right)=x_{1}^{3}+x_{2}^{3}+x_{3}^{3} f(x1,x2,x3)=x13+x23+x33

    下列n个多项式
    { σ 1 = x 1 + x 2 + ⋯ + x n σ 2 = x 1 x 2 + x 1 x 3 + ⋯ + x n − 1 x n σ n = x 1 x 2 ⋯ x n \left\{\begin{array}{ll} &\sigma_{1}=x_{1}+x_{2}+\cdots+x_{n} \\ &\sigma_{2}=x_{1} x_{2}+x_{1} x_{3}+\cdots+x_{n-1} x_{n} \\ &\sigma_{n}=x_{1} x_{2} \cdots x_{n} \end{array}\right. σ1=x1+x2++xnσ2=x1x2+x1x3++xn1xnσn=x1x2xn
    称为 n n n 个未定元 x 1 , x 2 , ⋯   , x n x_{1}, x_{2}, \cdots, x_{n} x1,x2,,xn 的初等对称多项式.

    性 质 \large\color{magenta}{\boxed{\color{brown}{性质 } }}

    1. 对称多项式的和、积仍是对称多项式;对称多项式的多项式仍为对称多项式. 即,若 f 1 , f 2 , ⋯   , f m ∈ P [ x 1 , x 2 , ⋯   , x n ] f_{1}, f_{2}, \cdots, f_{m} \in P\left[x_{1}, x_{2}, \cdots, x_{n}\right] f1,f2,,fmP[x1,x2,,xn] 为对称多项式, g ( y 1 , y 2 , ⋯   , y m ) g\left(y_{1}, y_{2}, \cdots, y_{m}\right) g(y1,y2,,ym) 为任一多项式, \quad

    g ( f 1 , f 2 , ⋯   , f m ) = h ( x 1 , x 2 , ⋯   , x n ) g\left(f_{1}, f_{2}, \cdots, f_{m}\right)=h\left(x_{1}, x_{2}, \cdots, x_{n}\right) g(f1,f2,,fm)=h(x1,x2,,xn)

    n n n 元对称多项式.

    特别地,初等对称多项式的多项式仍为对称多项式.

    1. 对称多项式基本定理

    对任一对称多项式 f ( x 1 , ⋯   , x n ) , f\left(x_{1}, \cdots, x_{n}\right), f(x1,,xn), 都有 n n n 元多项式 φ ( y 1 , y 2 , ⋯   , y n ) , \varphi\left(y_{1}, y_{2}, \cdots, y_{n}\right), φ(y1,y2,,yn), 使得
    f ( x 1 , ⋯   , x n ) = φ ( σ 1 , σ 2 , ⋯   , σ n ) f\left(x_{1}, \cdots, x_{n}\right)=\varphi\left(\sigma_{1}, \sigma_{2}, \cdots, \sigma_{n}\right) f(x1,,xn)=φ(σ1,σ2,,σn)
    σ 1 , σ 2 , ⋯   , σ n \sigma_{1}, \sigma_{2}, \cdots, \sigma_{n} σ1,σ2,,σn 为初等对称多项式.

    【证明】: 设对称多项式 f ( x 1 , ⋯   , x n ) f\left(x_{1}, \cdots, x_{n}\right) f(x1,,xn) 按字典排列法的首项为 a x 1 l 1 x 2 l 2 ⋯ x n l n , a x_{1}^{l_{1}} x_{2}^{l_{2}} \cdots x_{n}^{l_{n}}, \quad ax1l1x2l2xnln, 则必有
    l 1 ≥ l 2 ≥ ⋯ ≥ l n ≥ 0 l_{1} \geq l_{2} \geq \cdots \geq l_{n} \geq 0 l1l2ln0
    作对称多项式 φ 1 = a σ 1 l 1 − l 2 σ 2 l 2 − l 3 ⋯ σ n l n \quad \varphi_{1}=a \sigma_{1}^{l_{1}-l_{2}} \sigma_{2}^{l_{2}-l_{3}} \cdots \sigma_{n}^{l_{n}} φ1=aσ1l1l2σ2l2l3σnln

    φ 1 \varphi_{1} φ1 的首项为
    a x 1 l 1 − l 2 ( x 1 x 2 ) l 2 − l 3 ⋯ ( x 1 x 2 ⋯ x n ) l n = a x 1 l 1 x 2 l 2 ⋯ x n l n a x_{1}^{l_{1}-l_{2}}\left(x_{1} x_{2}\right)^{l_{2}-l_{3}} \cdots\left(x_{1} x_{2} \cdots x_{n}\right)^{l_{n}}=a x_{1}^{l_{1}} x_{2}^{l_{2}} \cdots x_{n}^{l_{n}} ax1l1l2(x1x2)l2l3(x1x2xn)ln=ax1l1x2l2xnln
    再作对称多项式
    f 1 = f − φ 1 = f ( x 1 , ⋯   , x n ) − a x 1 l 1 x 2 l 2 ⋯ x n l n − ⋯ f_{1}=f-\varphi_{1}=f\left(x_{1}, \cdots, x_{n}\right)-a x_{1}^{l_{1}} x_{2}^{l_{2}} \cdots x_{n}^{l_{n}}-\cdots f1=fφ1=f(x1,,xn)ax1l1x2l2xnln
    f 1 f_{1} f1 有比 f f f 较“小”的首项.对 f 1 f_{1} f1 重复上述作法,并依此下去.即有一系列对称多项式
    f , f 1 = f − φ 1 , f 2 = f 1 − φ 2 , ⋯ ⋯ f, f_{1}=f-\varphi_{1}, f_{2}=f_{1}-\varphi_{2}, \quad \cdots \cdots f,f1=fφ1,f2=f1φ2,
    它们的首项一个比一个“小”,所以必终此在有限步.故存在 h ∈ Z + h \in Z^{+} hZ+ 使 f h = f h − 1 − φ h = 0 f_{h}=f_{h-1}-\varphi_{h}=\mathbf{0} fh=fh1φh=0
    于是 f = φ 1 + φ 2 + ⋯ + φ h \quad f=\varphi_{1}+\varphi_{2}+\cdots+\varphi_{h} f=φ1+φ2++φh,这就是一个初等对称多项式的多项式.

    说 明 \Large\color{violet}{说明 }

    上述证明过程实际上是逐步消去首项.逐步消去首项法的一般步骤:

    第一步:找出对称多项式 f f f 的首项 a x 1 l 1 x 2 l 2 ⋯ x n l n , a x_{1}^{l_{1}} x_{2}^{l_{2}} \cdots x_{n}^{l_{n}}, ax1l1x2l2xnln,确定它对应的指数组 ( l 1 , l 2 , ⋯   , l n ) , \left(l_{1}, l_{2}, \cdots, l_{n}\right), (l1,l2,,ln), 则一定有
    l 1 ≥ l 2 ≥ ⋯ ≥ l n l_{1} \geq l_{2} \geq \cdots \geq l_{n} l1l2ln
    第二步:由 f f f 的首项写出 φ 1 \varphi_{1} φ1 :
    φ 1 = a σ 1 l 1 − l 2 σ 2 l 2 − l 3 ⋯ σ n l n \varphi_{1}=a \sigma_{1}^{l_{1}-l_{2}} \sigma_{2}^{l_{2}-l_{3}} \cdots \sigma_{n}^{l_{n}} φ1=aσ1l1l2σ2l2l3σnln
    第三步: 作 f 1 = f − φ 1 , f_{1}=f-\varphi_{1}, f1=fφ1, 并展开化简.再对 f 1 f_{1} f1 按一、二、三步骤进行,构造 f 2 f_{2} f2 :
    f 2 = f 1 − φ 2 ⋮ \begin{array}{c} f_{2}=f_{1}-\varphi_{2} \\ \vdots \end{array} f2=f1φ2
    如此反复进行,直到出现 f h = f h − 1 − φ h = 0 , f_{h}=f_{h-1}-\varphi_{h}=0, fh=fh1φh=0,
    f = φ 1 + φ 2 + ⋯ + φ h f=\varphi_{1}+\varphi_{2}+\cdots+\varphi_{h} f=φ1+φ2++φh

    例1

    把多项式 f \boldsymbol{f} f 表成初等对称多项式的多项式,
    f = x 1 3 + x 2 3 + x 3 3 f=x_{1}^{3}+x_{2}^{3}+x_{3}^{3} f=x13+x23+x33
    解: f f f 的首项是 x 1 3 , x_{1}^{3}, x13, 它所对应的数组是 ( 3 , 0 , 0 ) , (3,0,0), (3,0,0),
     令  φ 1 = σ 1 3 − 0 σ 2 0 − 0 σ 3 0 = σ 1 3 \text { 令 } \quad \varphi_{1}=\sigma_{1}^{3-0} \sigma_{2}^{0-0} \sigma_{3}^{0}=\sigma_{1}^{3}   φ1=σ130σ200σ30=σ13
    作对称多项式 f 1 f_{1} f1 :
    f 1 = f − φ 1 = x 1 3 + x 2 3 + x 3 3 − σ 1 3 = − 3 ( x 1 2 x 2 + x 2 2 x 1 + x 1 2 x 3 + x 3 2 x 1 + x 2 2 x 3 + x 3 2 x 2 ) − 6 x 1 x 2 x 3 \begin{array}{l} f_{1}=f-\varphi_{1}=x_{1}^{3}+x_{2}^{3}+x_{3}^{3}-\sigma_{1}^{3} \\ =-3\left(x_{1}^{2} x_{2}+x_{2}^{2} x_{1}+x_{1}^{2} x_{3}+x_{3}^{2} x_{1}+x_{2}^{2} x_{3}+x_{3}^{2} x_{2}\right)-6 x_{1} x_{2} x_{3} \end{array} f1=fφ1=x13+x23+x33σ13=3(x12x2+x22x1+x12x3+x32x1+x22x3+x32x2)6x1x2x3
    f 1 f_{1} f1 的首项是 − 3 x 1 2 x 2 , -3 x_{1}^{2} x_{2}, 3x12x2, 它所对应的指数组是 ( 2 , 1 , 0 ) , (2,1,0), (2,1,0),
      φ 2 = − 3 σ 1 2 − 1 σ 2 1 − 0 σ 3 0 = − 3 σ 1 σ 2 = − 3 ( x 1 + x 2 + x 3 ) ( x 1 x 2 + x 1 x 3 + x 2 x 3 ) = − 3 ( x 1 2 x 2 + x 2 2 x 1 + x 1 2 x 3 + x 3 2 x 1 + x 2 2 x 3 + x 3 2 x 2 ) − 9 x 1 x 2 x 3 \begin{array}{l} \text { } \begin{aligned} \varphi_{2} &=-3 \sigma_{1}^{2-1} \sigma_{2}^{1-0} \sigma_{3}^{0}=-3 \sigma_{1} \sigma_{2} \\ &=-3\left(x_{1}+x_{2}+x_{3}\right)\left(x_{1} x_{2}+x_{1} x_{3}+x_{2} x_{3}\right) \\ =&-3\left(x_{1}^{2} x_{2}+x_{2}^{2} x_{1}+x_{1}^{2} x_{3}+x_{3}^{2} x_{1}+x_{2}^{2} x_{3}+x_{3}^{2} x_{2}\right)-9 x_{1} x_{2} x_{3} \end{aligned} \end{array}  φ2==3σ121σ210σ30=3σ1σ2=3(x1+x2+x3)(x1x2+x1x3+x2x3)3(x12x2+x22x1+x12x3+x32x1+x22x3+x32x2)9x1x2x3
    作对称多项式 f 2 = f 1 − φ 2 = 3 x 1 x 2 x 3 \quad f_{2}=f_{1}-\varphi_{2}=3 x_{1} x_{2} x_{3} f2=f1φ2=3x1x2x3 ,令 φ 3 = 3 σ 1 1 − 1 σ 2 1 − 1 σ 3 1 − 0 = 3 σ 3 \varphi_{3}=3 \sigma_{1}^{1-1} \sigma_{2}^{1-1} \sigma_{3}^{1-0}=3 \sigma_{3} φ3=3σ111σ211σ310=3σ3
    于是 f 3 = f 2 − φ 3 = 0 \quad f_{3}=f_{2}-\varphi_{3}=0 f3=f2φ3=0
    所以, f = φ 1 + φ 2 + φ 3 = σ 1 3 − 3 σ 1 σ 2 + 3 σ 3 f=\varphi_{1}+\varphi_{2}+\varphi_{3}=\sigma_{1}^{3}-3 \sigma_{1} \sigma_{2}+3 \sigma_{3} f=φ1+φ2+φ3=σ133σ1σ2+3σ3

    附 : \Large\color{violet}{附: }

    对于齐次对称多项式还可以采用待定系数法.待定系数法的一般步骤:(设 f f f 是m次齐次对称多项式)

    第一步:根据对称多项式 f f f 首项对应的指数组写出所有可能的指数组 ( k 1 , k 2 , ⋯   , k n ) \left(k_{1}, k_{2}, \cdots, k_{n}\right) (k1,k2,,kn) 且这些指数组满足 :
    (1) k 1 ≥ k 2 ≥ ⋯ ≥ k n k_{1} \geq k_{2} \geq \cdots \geq k_{n} k1k2kn
    (2) k 1 + k 2 + ⋯ + k n = m k_{1}+k_{2}+\cdots+k_{n}=m k1+k2++kn=m
    (3) 前面的指数组先于后面的指数组.

    第二步: 对每个指数组 ( k 1 , k 2 , ⋯   , k n ) , \left(k_{1}, k_{2}, \cdots, k_{n}\right), (k1,k2,,kn), 写出它对应的初等对称多项式的方幕的乘积:
    σ 1 k 1 − k 2 σ 2 k 2 − k 3 ⋯ σ n k n \sigma_{1}^{k_{1}-k_{2}} \sigma_{2}^{k_{2}-k_{3}} \cdots \sigma_{n}^{k_{n}} σ1k1k2σ2k2k3σnkn
    第三步:设出 f f f 由所有初等对称多项式的方幕乘积的线性表达式,其首项系数即为 f f f 的首项系数,其余各项系数分别用A、B、C、… 代替.

    第四步:分组选取适当的 x i ( i = 1 , 2 , ⋯   , n ) x_{i}(i=1,2, \cdots, n) xi(i=1,2,,n) 的值,计算出 σ 1 , σ 2 , ⋯   , σ n \sigma_{1}, \sigma_{2}, \cdots, \sigma_{n} σ1,σ2,,σn f f f,将之代入第三步中设出的线性表达式中,得到关于A、B、C、… 的线性方程组,解这个线性方程组求得A、B、C、… 的值.最后写出所求的 f f f 的表达式.

    例2 \quad

    用待定系数法把 f = x 1 3 + x 2 3 + x 3 3 f=x_{1}^{3}+x_{2}^{3}+x_{3}^{3} f=x13+x23+x33 表成初等对称多项式的多项式.

    解: f f f 的首项是 x 1 3 , x_{1}^{3}, x13, 它所对应的数组是 ( 3 , 0 , 0 ) , (3,0,0), (3,0,0),所有不先于 (3,0,0)的三次指数组及相应的初等对称多项式方幕的乘积如下表:

    指数组相应的初等对称多项式方幕的乘积
    ( 3 , 0 , 0 ) \mathbf{( 3 , 0 , 0 )} (3,0,0) σ 1 3 − 0 σ 2 0 − 0 σ 3 0 = σ 1 3 \sigma_{1}^{3-0} \sigma_{2}^{0-0} \sigma_{3}^{0}=\sigma_{1}^{3} σ130σ200σ30=σ13
    ( 2 , 1 , 0 ) \mathbf{( 2 , 1 , 0 )} (2,1,0) σ 1 2 − 1 σ 2 1 − 0 σ 3 0 = σ 1 σ 2 \sigma_{1}^{2-1} \sigma_{2}^{1-0} \sigma_{3}^{0}=\sigma_{1} \sigma_{2} σ121σ210σ30=σ1σ2
    ( 1 , 1 , 1 ) \mathbf{( 1 , 1 , 1 )} (1,1,1) σ 1 1 − 1 σ 2 1 − 1 σ 3 1 = σ 3 \sigma_{1}^{1-1} \sigma_{2}^{1-1} \sigma_{3}^{1}=\sigma_{3} σ111σ211σ31=σ3

    这样, f f f 可表成
    f = σ 1 3 + A σ 1 σ 2 + B σ 3 (5) f=\sigma_{1}^{3}+A \sigma_{1} \sigma_{2}+B \sigma_{3}\tag{5} f=σ13+Aσ1σ2+Bσ3(5)

    适当选取 x i ( i = 1 , 2 , 3 ) x_{i}(i=1,2,3) xi(i=1,2,3) 的值,计算出 σ 1 , σ 2 , ⋯   , σ n \sigma_{1}, \sigma_{2}, \cdots, \sigma_{n} σ1,σ2,,σn f f f 的值如下表:

    x 1 \boldsymbol{x}_{\mathbf{1}} x1 x 2 \boldsymbol{x}_{\mathbf{2}} x2 x 3 \boldsymbol{x}_{\mathbf{3}} x3 σ 1 \sigma_{\mathbf{1}} σ1 σ 2 \sigma_{\mathbf{2}} σ2 σ 3 \sigma_{\mathbf{3}} σ3 f {\mathbf{f}} f
    1113313
    1102102

    代入 (5) 式得 { 27 + 9 A + B = 3 8 + 2 A = 2 \left\{\begin{array}{c}27+9 A+B=3 \\ 8+2 A=2\end{array}\right. {27+9A+B=38+2A=2
    解之得 A = − 3 , B = 3 \quad A=-3, \quad B=3 A=3,B=3,所以 f = σ 1 3 − 3 σ 1 σ 2 + 3 σ 3 \quad f=\sigma_{1}^{3}-3 \sigma_{1} \sigma_{2}+3 \sigma_{3} f=σ133σ1σ2+3σ3

    一 元多项式的判别式

    对称多项式
    D ( x 1 , ⋯   , x n ) = ∏ 1 ≤ i < j ≤ n ( x i − x j ) 2 \quad D\left(x_{1}, \cdots, x_{n}\right)=\prod_{1 \leq i<j \leq n}\left(x_{i}-x_{j}\right)^{2} D(x1,,xn)=1i<jn(xixj)2
    有特殊的重要性. 按对称多项式基本定理知,D可表成 σ 1 = − a 1 , σ 2 = ( − 1 ) 2 a 2 , ⋯   , σ n = ( − 1 ) n a n \sigma_{1}=-a_{1}, \quad \sigma_{2}=(-1)^{2} a_{2}, \quad \cdots, \quad \sigma_{n}=(-1)^{n} a_{n} σ1=a1,σ2=(1)2a2,,σn=(1)nan的多项式 D ( a 1 , ⋯   , a n ) . D\left(a_{1}, \cdots, a_{n}\right) . D(a1,,an). 由根与系数的关系知, x 1 , ⋯   , x n x_{1}, \cdots, x_{n} x1,,xn
    f ( x ) = x n + a 1 x n − 1 + a 2 x n − 2 + ⋯ + a n (6) f(x)=x^{n}+a_{1} x^{n-1}+a_{2} x^{n-2}+\cdots+a_{n}\tag{6} f(x)=xn+a1xn1+a2xn2++an(6)
    的根,则多项(6)有重根的充要条件是
    D ( a 1 , ⋯   , a n ) = 0 D\left(a_{1}, \cdots, a_{n}\right)=0 D(a1,,an)=0
    正因为此, D ( a 1 , ⋯   , a n ) = 0 D\left(a_{1}, \cdots, a_{n}\right)=0 D(a1,,an)=0称为多项式(6)的判别式

    例3

    f ( x ) = x 2 + a 1 x + a 2 f(x)=x^{2}+a_{1} x+a_{2} f(x)=x2+a1x+a2 的判别式.
    D = ( x 1 − x 2 ) 2 = x 1 2 − 2 x 1 x 2 + x 2 2 = ( x 1 + x 2 ) 2 − 4 x 1 x 2 = σ 1 2 − 4 σ 2 = a 1 2 − 4 a 2 \begin{aligned} D=&\left(x_{1}-x_{2}\right)^{2}=x_{1}^{2}-2 x_{1} x_{2}+x_{2}^{2} \\ &=\left(x_{1}+x_{2}\right)^{2}-4 x_{1} x_{2} \\ &=\sigma_{1}^{2}-4 \sigma_{2}=a_{1}^{2}-4 a_{2} \end{aligned} D=(x1x2)2=x122x1x2+x22=(x1+x2)24x1x2=σ124σ2=a124a2

    参考资料

    高等代数 厦门大学

    高等代数,林亚南,高等教育出版社

    《高等代数》(第四版) 高等教育出版社

    高等代数 电子科技大学

    高等代数_安阳师范学院

    《高等代数》(第五版)

    展开全文
  • 基于多线性映射和同态加密方案,提出了可验证的多元多项式外包计算方案,用户可准确验证外包计算结果的正确性。方案在标准模型中可证安全,且多项式函数和用户输入对于服务器都是保密的。分析表明,用户计算量远小于...
  • 一个复杂的多项式可以“过拟合”任意数据,言外之意是多项式函数可以接近于任何函数,这是什么道理呢? 泰勒公式  欲理解多项式函数的过拟合,必先理解泰勒公式。  泰勒公式是一种计算近似值的方法,它是一个...

      一个复杂的多项式可以“过拟合”任意数据,言外之意是多项式函数可以接近于任何函数,这是什么道理呢?

    泰勒公式

      欲理解多项式函数的过拟合,必先理解泰勒公式。

      泰勒公式是一种计算近似值的方法,它是一个用函数某点的信息描述在该点附近取值的公式。已知函数在某一点的各阶导数值的情况之下,泰勒公式可以用这些导数值做系数构建一个多项式来逼近函数在这一点的邻域中的值。

      如果f(x)在x0处具有任意阶导数,那么泰勒公式是这样的:

      上式中的幂级数称为f(x)在x0点的泰勒级数。(0的阶乘是1)

        更多泰勒公式的介绍可参考  单变量微积分笔记31——幂级数和泰勒级数

     

    泰勒公式的应用

      来看一个泰勒公式的应用。假设一个小偷盗取了一辆汽车,他在高速公路上沿着一个方向行驶,车辆的位移s是关于时间t的函数。警方接到报案后马上调取监控,得知在零点(t=0时刻)小偷距车辆丢失地点的位移是s0。现在的时间是0:30,警方想要在前方设卡,从而能在凌晨1点拦住小偷,应该在哪里设卡呢?

      我们知道车辆在0点时的位移是s0,现在想要知道凌晨1点时车辆的位置:

      可以直接使用泰勒公式:

      泰勒公式可以无限展开,展开得越多,越逼近真实值,并且越到后面的项,对结果的影响越小,我们认为0和1非常接近,所以只展开到2阶导数:

      这就是最终结果,在此处设卡最有可能在第一时间拦住小偷。

    在0点处的泰勒展开

      在使用泰勒公式时,经常取x0=0。

      f(x)=ex是一个可以用泰勒公式展开的例子,下面是ex在x0=0处的泰勒展开:

      当x=1时,还附带得到了e的解释:

      我们使用一个很难处理的积分解释泰勒展开的意义,对正态分布进行积分:

      常规的方法很难处理。现在,由于被积函数与ex相似,我们又已经知道ex的展开式,所以可以进行下面的变换:

      将exp(-x2)左右两侧同时积分:

      很容易计算右侧的每一项积分。

      这个例子展示了幂级数展开的意义——把质的困难转化成量的复杂。展开前求解函数的值很困难,展开后是幂级数,虽然有很多很多项,但是每一项都是幂函数,都很容易求解,于是,只要对展开后的函数求和,就能得到展开前的函数的值。

    为什么在0点处展开

      当x0=0时,可以极大地简化泰勒展开式。之前说泰勒公式是一个用函数某点的信息描述在该点附近取值的公式,一个函数中的某点如果距离0很远怎么办呢?实际上泰勒公式也能够逼近函数在距离0很远处的取值,只不过此时只展开到2阶导数是不够的,需要展开很多项,展开的越多,越能逼近该点。以标准正态分布函数f(x)=exp(-x2)为例,虽然它在二阶展开使与原函数相差较大,但是当展开到40阶时就已经非常接近原函数了。

    多项式函数

      理解了泰勒公式后,再回到问题的原点,看看多项式函数为什么可以接近于任何函数。

      仍然以标准正态分布为例,它在x0 = 0点处的10阶泰勒展开是:

      如果将每一项中的xi都看作一个维度,那么这个多项式函数可以写成多元线性回归的形式:

      这就将一个一元的非线性问题转换成了多元的线性问题,从而利用最小二乘法求得模型参数。

      下面的代码以ln(2x) + 2为原函数,生成40个在-1~1之间随机震荡的数据点,并使用线性回归和多项式回归拟合数据点:

     

    import numpy as np
    import matplotlib.pyplot as plt
    
    def create_datas():
        '''
        生成10个待拟合的点
        :return: xs, ys
        '''
        xs = np.arange(0.1, 4, 0.1)
        # y = ln(2x) + noize,  -1 <= noize <= 1
        ys = np.array([np.log(x * 2) + 2 + np.random.uniform(-1, 1) for x in xs])
    
        return xs, ys
    
    class Regression():
        ''' 回归类 '''
        def __init__(self, xs, ys):
            '''
            :param xs: 输入数据的特征集合
            :param ys: 输入数据的标签集合
            '''
            self.xs, self.ys = xs, ys
            self.theta = None # 模型参数
    
        def train_datas(self, xs=None):
            '''
            重新构造训练样本的特征和标签
            :param xs: 输入数据的特征集合
            :return: 矩阵形式的训练样本特征和标签
            '''
            xs = self.xs if xs is None else xs
            X = self.train_datas_x(xs)
            Y = np.c_[ys] # 将ys转换为m行1列的矩阵
            return X, Y
    
        def train_datas_x(self, xs):
            '''
            重新构造训练样本的特征
            :param xs: 输入数据的特征集合
            :return: 矩阵形式的训练样本特征
            '''
            m = len(xs)
            # 在第一列添加x0,x0=1,并将二维列表转换为矩阵
            X = np.mat(np.c_[np.ones(m), xs])
            return X
    
        def fit(self):
            ''' 数据拟合 '''
            X, Y = self.train_datas()
            self.theta = (X.T * X).I * X.T * Y
    
        def predict(self, xs):
            '''
            根据模型预测结果
            :param xs: 输入数据的特征集合
            :return: 预测结果
            '''
            X = self.train_datas(xs=xs)[0]
            return self.theta.T * X.T
    
        def show(self):
            ''' 绘制拟合结果 '''
            plt.figure()
            plt.scatter(self.xs, self.ys, color='r', marker='.', s=10)  # 绘制数据点
            self.show_curve(plt) # 绘制函数曲线
            plt.xlabel('x')
            plt.ylabel('y')
            plt.axis('equal')
            plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
            plt.rcParams['axes.unicode_minus'] = False  # 解决中文下的坐标轴负号显示问题
            plt.legend(['拟合曲线', '样本点'])
            plt.show()
    
        def show_curve(self, plt):
            ''' 绘制函数曲线 '''
            pass
    
        def global_fun(self):
            ''' 返回目标函数 '''
            gf = ['(' + str(t[0, 0]) + str(i) + ')x^' + str(i) for i, t in enumerate(self.theta)]
            return ' + '.join(gf)
    
    class Linear(Regression):
        ''' 线性模型'''
        def show_curve(self, plt):
            '''
            绘制拟合结果
            :param plt: 输入数据的特征集合
            '''
            xx = [self.xs[0], self.xs[-1]]
            yy = self.predict(xx)
            plt.plot(xx, np.array(yy)[0])
    
    class Multinomial(Regression):
        ''' 多项式回归模型 '''
        def __init__(self, xs, ys, n=3):
            '''
            :param xs: 输入数据的特征集合
            :param ys: 输入数据的标签集合
            :param n: 多项式的项数
            '''
            super().__init__(xs, ys)
            self.n = n
    
        def train_datas_x(self, xs):
            '''
            重新构造训练样本的特征
            :param xs: 输入数据的特征集合
            :return: 矩阵形式的训练样本特征
            '''
            X = super().train_datas_x(xs)
            for i in range(2, self.n + 1):
                X = np.column_stack((X, np.c_[xs ** i])) # 构造样本的其他特征
            return X
    
        def show_curve(self, plt):
            ''' 绘制函数曲线 '''
            xx = np.linspace(self.xs[0], self.xs[-1], len(self.xs) * 20)
            yy = self.predict(xx)
            plt.plot(xx, np.array(yy)[0], '-')
    
    if __name__ == '__main__':
        xs, ys = create_datas()
        regressions = [Linear(xs, ys), Multinomial(xs, ys), Multinomial(xs, ys, n=5), Multinomial(xs, ys, n=10)]
        for r in regressions:
            r.fit()
            r.show()
            print(r.global_fun())
    

    (1.702537204930)x^0 + (0.75431357262260011)x^1

     

     (0.23422131704216660)x^0 + (3.8713793437217621)x^1 + (-1.51749485964066682)x^2 + (0.206815637166500283)x^3

     (0.0023811193415048670)x^0 + (4.707160334405161)x^1 + (-2.03334533257402762)x^2 + (0.095635349482284143)x^3 + (0.130611330518000564)x^4 + (-0.021122013844903465)x^5

    (-4.7285135624557920)x^0 + (77.637488456533421)x^1 + (-377.238590224254552)x^2 + (932.32693158635363)x^3

    + (-1305.30725871564164)x^4 + (1112.9257341435945)x^5 + (-598.57958115210336)x^6

    + (203.91275172701427)x^7 + (-42.641981259587898)x^8 + (4.9915417588645349)x^9 + (-0.250300601937088710)x^10

       看来第二、三条曲线的拟合效果比较好,第一幅图欠拟合,四过拟合。


      作者:我是8位的

      出处:http://www.cnblogs.com/bigmonkey

      本文以学习、研究和分享为主,如需转载,请联系本人,标明作者和出处,非商业用途! 

      扫描二维码关注公作者众号“我是8位的”

    展开全文
  • K函数多元Bernstein多项式
  • 2.2 多项式函数 看其他篇章到目录 选择。 在 Commons Math中的 analysis.polynomials包中有所有的与多项式函数相关的类和接口定义。这一篇主要从这个包分析,来研究一下多项式函数的应用。   ...

    2.2 多项式函数

    看其他篇章到目录 选择。

    在 Commons Math中的 analysis.polynomials包中有所有的与多项式函数相关的类和接口定义。这一篇主要从这个包分析,来研究一下多项式函数的应用。


     

    Polynomials包中没有 interface的定义,下属含有 5个类: PolynomialFunction、 PolynomialFunctionLagrangeForm、 PolynomialFunctionNewtonForm、 PolynomialSplineFunction和 PolynomialsUtils。其中主要的只有 PolynomialFunction和 PolynomialSplineFunction,正如 api doc中的介绍, PolynomialFunction类是 Immutable representation of a real polynomial function with real coefficients——实数多项式的表示; PolynomialSplineFunction类是 Represents a polynomial spline function.——样条曲线多项式的表示。另外两个表示拉格朗日和牛顿形式的多项式函数。而 PolynomialsUtils类中提供了几个构造个别(比如切比雪夫多项式)多项式的静态方法。

    我觉得最常用的应该就是实数系数的多项式了,因此以 PolynomialFunction类为例来进行分析。实数系数的多项式函数形如: f(x) = ax^2 + bx + c。 PolynomialFunction类实现了 DifferentiableUnivariateRealFunction接口,因此必须实现 value()和 derivative()方法,并且实现该接口也表明这是一元可微分的实数函数形式。 PolynomialFunction类定义了一组 final double coefficients[]作为多项式系数,其中 coefficients[0]表示常数项的系数, coefficients[n]表示指数为 n的 x^n次项的系数。因此,这个类所表达的多项式函数是这样的: f(x)=coeff[0] + coeff[1]x + coeff[2]x^2 + … + coeff[n]x^n。它的构造方法是 PolynomialFunction(double [])就是接受这样的 coefficients数组作为系数输入参数来构造多项式的。这个是很好表达也很方便理解的。那么它的 value(double x)方法是通过调用 double evaluate(double [] coefficients, double argument)实现的,本质用 Horner's Method求解多项式的值,没有什么技术难点,非常好理解的一个给定参数和函数求值过程。剩余定义的一些加减乘等操作,都是通过一个类似public PolynomialFunction add(final PolynomialFunction p)这样的结构实现的。求导数的方法 derivative()是通过这样的一个微分操作实现的。见源码:

     

     
     1 protected   static   double [] differentiate( double [] coefficients)  {
     2          int  n  =  coefficients.length;
     3          if  (n  <   1 {
     4              throw  MathRuntimeException.createIllegalArgumentException( " empty polynomials coefficients array " );
     5         }

     6          if  (n  ==   1 {
     7              return   new   double [] { 0 } ;
     8         }

     9          double [] result  =   new   double [n  -   1 ];
    10          for  ( int  i  =  n  -   1 ; i   >   0 ; i -- {
    11             result[i  -   1 =  i  *  coefficients[i];
    12         }

    13          return  result;
    14     }

    15
     

    测试代码示例如下:

     1 /** */ /**
     2  * 
     3   */

     4 package  algorithm.math;
     5
     6 import  org.apache.commons.math.ArgumentOutsideDomainException;
     7 import  org.apache.commons.math.analysis.polynomials.PolynomialFunction;
     8 import  org.apache.commons.math.analysis.polynomials.PolynomialSplineFunction;
     9
    10 /** */ /**
    11  *  @author  Jia Yu
    12  * @date 2010-11-21
    13   */

    14 public   class  PolinomialsFunctionTest  {
    15
    16      /** */ /**
    17      *  @param  args
    18       */

    19      public   static   void  main(String[] args)  {
    20          //  TODO Auto-generated method stub
    21         polynomials();
    22         System.out.println( " ----------------------------------------------- " );
    23         polynomialsSpline();
    24     }

    25
    26      private   static   void  polynomialsSpline()  {
    27          //  TODO Auto-generated method stub
    28         PolynomialFunction[] polynomials  =   {
    29                  new  PolynomialFunction( new   double []  { 0d, 1d, 1d } ),
    30                  new  PolynomialFunction( new   double []  { 2d, 1d, 1d } ),
    31                  new  PolynomialFunction( new   double []  { 4d, 1d, 1d } ) }
    ;
    32          double [] knots  =   - 1 0 1 2  } ;
    33         PolynomialSplineFunction spline  =   new  PolynomialSplineFunction(knots,
    34                 polynomials);
    35          // output directly
    36         System.out.println( " poly spline func is  " + spline);
    37          //  get the value when x = 0.5
    38          try   {
    39             System.out.println( " f(0.5) =  " + spline.value( 0.5 ));
    40         }
      catch  (ArgumentOutsideDomainException e)  {
    41              //  TODO Auto-generated catch block
    42             e.printStackTrace();
    43         }

    44          //  the number of spline segments
    45         System.out.println( " spline segments number is  " + spline.getN());
    46          //  the polynomials functions
    47          for ( int  i = 0 ;i < spline.getN();i ++ ) {
    48             System.out.println( " spline:f " + i + " (x) =  " + spline.getPolynomials()[i]);
    49         }

    50          // function derivative
    51         System.out.println( " spline func derivative is  " + spline.derivative());
    52     }

    53
    54      private   static   void  polynomials()  {
    55          //  TODO Auto-generated method stub
    56          double [] f1_coeff  =   3.0 6.0 - 2.0 1.0  } ;
    57          double [] f2_coeff  =   1.0 2.0 - 1.0 - 2.0  } ;
    58         PolynomialFunction f1  =   new  PolynomialFunction(f1_coeff);
    59         PolynomialFunction f2  =   new  PolynomialFunction(f2_coeff);
    60          //  output directly
    61         System.out.println( " f1(x) is :  "   +  f1);
    62         System.out.println( " f2(x) is :  "   +  f2);
    63          //  polynomial degree
    64         System.out.println( " f1(x)'s degree is  "   +  f1.degree());
    65          //  get the value when x = 2
    66         System.out.println( " f1(2) =  "   +  f1.value( 2 ));
    67          //  function add
    68         System.out.println( " f1(x)+f2(x) =  "   +  f1.add(f2));
    69          //  function substract
    70         System.out.println( " f1(x)-f2(x) =  "   +  f1.subtract(f2));
    71          //  function multiply
    72         System.out.println( " f1(x)*f2(x) =  "   +  f1.multiply(f2));
    73          //  function derivative
    74         System.out.println( " f1'(x) =  "   +  f1.derivative());
    75         System.out.println( " f2''(x) =  "
    76                  +  ((PolynomialFunction) f2.derivative()).derivative());
    77
    78     }

    79
    80 }

    81


    输出如下:
    f1(x) is : 3.0 + 6.0 x - 2.0 x^2 + x^3
    f2(x) is : 1.0 + 2.0 x - x^2 - 2.0 x^3
    f1(x)'s degree is 3
    f1(2) = 15.0
    f1(x)+f2(x) = 4.0 + 8.0 x - 3.0 x^2 - x^3
    f1(x)-f2(x) = 2.0 + 4.0 x - x^2 + 3.0 x^3
    f1(x)*f2(x) = 3.0 + 12.0 x + 7.0 x^2 - 15.0 x^3 - 8.0 x^4 + 3.0 x^5 - 2.0 x^6
    f1'(x) = 6.0 - 4.0 x + 3.0 x^2
    f2''(x) = -2.0 - 12.0 x
    -----------------------------------------------
    poly spline func is org.apache.commons.math.analysis.polynomials.PolynomialSplineFunction@69b332
    f(0.5) = 2.75
    spline segments number is 3
    spline:f0(x) = x + x^2
    spline:f1(x) = 2.0 + x + x^2
    spline:f2(x) = 4.0 + x + x^2
    spline func derivative is org.apache.commons.math.analysis.polynomials.PolynomialSplineFunction@173a10f

    PolynomialFunction类也是重写了 toString方法和 hashCode和 equals方法的。

    PolynomialSplineFunction类是多项式样条函数,样条 是一种特殊的函数,由多项式分段定义。表示了一个由多个多项式组成的样条曲线。它的实现主要是内部定义了一个多项式函数组 PolynomialFunction polynomials[]和一个样条分界节点数组 double knots[]。这两个内部成员分别表示什么呢?分界节点表示整条曲线对应在 x等于 knots[i]的时候开始使用其他多项式样条,其构造方法 public PolynomialSplineFunction(double knots[], PolynomialFunction polynomials[])完成这样的功能。

    举例来说,一个多项式样条函数就是一个分段函数:

          X^2+x    [-1,0)

    F(x) = x^2+x+2   [0,1)

          X^2+x+4 [1,2)

    当然,构造方法中的参数, knots[]数组必须是递增的。

    可以看到,直接输出 PolynomialSplineFunction是多么丑陋啊 ~~,因为它没有重写 toString方法。同样,它的导数也是一样的丑陋。其中如果给定的值不在定义域内, value方法还抛出异常 ArgumentOutsideDomainException。

    最后 PolynomialFunctionLagrangeForm和 PolynomialFunctionNewtonForm类完成的其实是多项式插值的功能,放到下一节研究的。

    相关资料:

    多项式: http://zh.wikipedia.org/zh-cn/%E5%A4%9A%E9%A1%B9%E5%BC%8F%E5%87%BD%E6%95%B0#.E5.A4.9A.E9.A0.85.E5.BC.8F.E5.87.BD.E6.95.B8.E5.8F.8A.E5.A4.9A.E9.A0.85.E5.BC.8F.E7.9A.84.E6.A0.B9

    样条函数: http://zh.wikipedia.org/zh-cn/%E6%A0%B7%E6%9D%A1%E5%87%BD%E6%95%B0

    Horner Methods: http://mathworld.wolfram.com/HornersMethod.html

    Commons math包: http://commons.apache.org/math/index.html

    展开全文
  • torch学习 (七):多项式函数拟合实验

    千次阅读 2020-12-06 11:18:20
      本文通过多项式函数的拟合实验,来理解模型复杂度和训练数据集大小对欠拟合和过拟合的影响。   参考文献:李沐、Aston Zhang等老师的这本《动手学深度学习》一书。 1 生成数据集   给定样本特征x{x}x,将...
  • MATLAB多项式函数拟合和曲线拟合

    千次阅读 2014-03-18 11:01:44
    多项式函数拟合:a=polyfit(xdata,ydata,n) 其中n表示多项式的最高阶数,xdata,ydata为将要拟合的数据,它是用数组的方式输入.输出参数a为拟合多项式 的系数  多项式在x处的值y可用下面程序计算.  y=...
  • 数据分析中经常会使用到数据拟合,本文中将阐述如何实现一元以及多元的线性拟合以及多项式拟合,本文中只涉及实现方式,不涉及理论知识。 模型拟合中涉及的误差评估方法如下所示: import numpy as np def stdError...
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼>> main_for_ode15iFirst-order Norm ofIter F-count f(x) Feasibility optimality step0 4 -5.364000e+00 0.000e+00 2.053e+001 8 ...
  • 多项式函数拟合实验 注:t.my_ones_packages是我自己根据《动手学深度学习》目前学习过程中出现的所有自定义函数进行集中得到的文档。 《动手学深度学习》也向读者提供了一个包含所有自定义函数的包“d2lzh”大家...
  • 二元多项式的加减乘计算 如 输入: (x^3+y^9+x*z^4)-(x^4*y+8*y^3*z*6)
  • Ⅰ.多元周期函数的非整数次积分设f(P)是在整个m维空间Ω上连续的函数,并且假定积分......
  • 0≤y≤2π,我们所考虑的函数f(x,y)都是在D上确定的周期函数,关于每一变量的周期都是2π。 假如f(x,y)在D上有p级连绩偏导数,我们就用feC~p(D)来表示。当p=0时,C~o(D)简记作C(D),表示在D上连续的函数类。
  • syms x s t; polynomialReduce(x^100 -5sx^3 +2sx+t,[x,s,t] ),x)
  • 将Malliavin在半平面关于一元解析函数唯一性的定理推广到多重复零点情形,并推广到多元情形,利用所得结果研究了多元复指数函数系对多元函数的加权逼近及其闭包的描述。
  • 多项式指数函数(exp)

    2020-07-30 21:05:42
    多项式指数函数(exp) 已知A(x)A(x)A(x),求使得B(x)≡eA(x)(modxn)B(x)\equiv{e^{A(x)}}\pmod{x^n}B(x)≡eA(x)(modxn)的B(x)B(x)B(x) 前置知识:牛顿迭代(咕咕咕) 观察本题,由于 B(x)≡eA(x)(modxn)ln⁡B(x)−A(x)...
  • 多项式函数相关推导

    千次阅读 2018-11-20 15:48:10
    定义 设x=(x1,x2,…,xn)T∈Rnx=(x_1,x_2,\dots,x_n)^T \in R^nx=(x1​,x2​,…,xn​)T∈Rn,则称乘积xj1xj2…xjdx_{j_1}x_{j_2}\dots x_{j_d}xj1​​xj2​​…xjd​​为xxx的一个ddd阶多项式,其中j1,j2,…,jd∈{1,2,...
  • 一、函数的近似表示—高次多项式 二、误差函数—最小二乘法 三、引出案例函数曲线 四、目标函数 五、优化目标函数 六、优化目标函数—梯度下降法 七、优化目标函数—求解线性方程组 八、python编程实现拟合...
  • 多项式逼近连续函数

    千次阅读 2020-12-21 22:04:44
    本文可作为线性代数实现线性回归的下篇,先简单回顾一下,线性代数实现线性回归中介绍了子空间的概念,把子空间...本文将拓展子空间的概念,空间的元素是函数称之为函数空间,这个空间里面有我们熟悉的各种函数以及这...
  • 一、业务场景: ...答:这是个拟合问题,视情况用线性拟合和多项式拟合来拟合。通过拟合打分看拟合效果。 3. 这个具体函数能否给出来? 答:可以通过 二、下面分四部分来用代码解决上述问题 1. 对数
  • polyfit函数是matlab中用于进行曲线拟合的一个函数。其数学基础是最小二乘法曲线拟合原理。曲线拟合:已知离散点上的数据集,即已知在点集上的函数值,构造一个解析函数(其图形为一曲线)使在原离散点上尽可能接近...
  • 多元函数的公式: 其实就是相当于位置参数的变量都增多了,我们的解决办法依旧可以使用我们一元线性回归当中的代价函数和梯度下降算法。 代价函数依旧是: 梯度下降算法为: 我们可以看到,有多少个参数变量,...
  • 多元样条函数及其应用
  • 利用光滑模和K-泛函给出了一类多元三角多项式算子同时逼近的正逆定理。进一步得出了该类算子的本质同时逼近精度和最大同时逼近能力,刻画了同时逼近精度与被逼近函数光滑性之间的关系。
  • 本篇博客是B站教学视频的学习笔记,...Matlab多项式与数据统计 % 介绍多项式的内容 p=[1,2,3,4]; f1=poly2str(p,'x'); % 生成好看的符号串 % disp(f1) 结果为 x^3 + 2 x^2 + 3 x + 4 f2=poly2sym(p); % 生成可用的符号.
  • 主要介绍了scikit-learn线性回归,多元回归,多项式回归的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 以K-泛函、光淆模为工具,利用两数分解等方法,研究单纯形上多元Durrmeyer多项式遥近连续函数的速度问厄,估计了收效速度,从而完善了Berens,H.等人的工作。
  • 多元函数的泰勒(Taylor)展开式

    万次阅读 多人点赞 2017-04-20 15:17:22
    多元函数的泰勒展开式实际优化问题的目标函数往往比较复杂。为了使问题简化,通常将目标函数在某点附近展开为泰勒(Taylor)多项式来逼近原函数。 一元函数在点xkx_k处的泰勒展开式为: f(x)=f(xk)+(x−xk)f′(xk)+12...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,521
精华内容 2,608
关键字:

多元多项式函数