首页 > 其他分享 >多项式曲线拟合

多项式曲线拟合

时间:2024-06-09 16:57:38浏览次数:24  
标签:曲线拟合 index 多项式 System result double public out

package 曲线拟合.fitting;



import org.apache.commons.math3.fitting.PolynomialCurveFitter;
import org.apache.commons.math3.fitting.WeightedObservedPoints;

import com.sun.tools.javac.util.Log;

import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.List;
@Slf4j
public class TimeCostCalculator {
    public static void main(String[] args) throws Exception {
        TimeCostCalculator tcc = new TimeCostCalculator();
        double timeCost = tcc.calcTimeCost(new CalcCurveFitting());
        System.out.println("--------------------------------------------------------------------------");
        System.out.println("time cost is: " + timeCost + "s");
        System.out.println("--------------------------------------------------------------------------");
    }

    /**
     * 计算指定对象的运行时间开销。
     *
     * @param curveFitting 指定被测对象。
     * @return 返回sub.run的时间开销,单位为s。
     * @throws Exception
     */
    public double calcTimeCost(CurveFitting curveFitting) throws Exception {
        List<Object> params = curveFitting.getParams();
        long startTime = System.nanoTime();
        Object result = curveFitting.run(params);
        long stopTime = System.nanoTime();
        curveFitting.printResult(result);
        System.out.println("start: " + startTime + " / stop: " + stopTime);
        return 1.0e-9 * (stopTime - startTime);
    }

}


interface CurveFitting {
    public List<Object> getParams();

    public Object run(List<Object> params) throws Exception;

    public void printResult(Object result);
}

class CalcCurveFitting implements CurveFitting {

    private WeightedObservedPoints points;

    private final int degree = 9;    // 阶数

    public CalcCurveFitting() {
        int arrayLength = 200000;
        System.out.println(String.format("本算例用于计算多项式曲线拟合。正在初始化计算数据(%s点,%s阶......", arrayLength, degree));
        double[] inputDataX = new double[arrayLength];
             // inputDataX = new double[] {1, 2, 3, 4, 5, 6, 7};
        double[] inputDataY = new double[inputDataX.length];
        double[] factor = new double[degree + 1];    // N阶多项式会有N+1个系数,其中之一为常数项
        for (int index = 0; index < factor.length; index++) {
            factor[index] = index + 1;
        }
        for (int index = 0; index < inputDataY.length; index++) {
            inputDataX[index] = index * 0.00001;
            inputDataY[index] = calcPoly(inputDataX[index], factor);    // y = sum(x[n) * fact[n])
            // System.out.print(inputDataY[index] + ", ");
        }
        points = new WeightedObservedPoints();
        for (int index = 0; index < inputDataX.length; index++) {
            points.add(inputDataX[index], inputDataY[index]);
        }
        System.out.println("init completely");
    }

    @Override
    public List<Object> getParams() {
        List<Object> params = new ArrayList<Object>();
        params.add(points);
        return params;
    }

    @Override
    public Object run(List<Object> params) throws Exception {
        PolynomialCurveFitter fitter = PolynomialCurveFitter.create(degree);
        WeightedObservedPoints points = (WeightedObservedPoints) params.get(0);
        double[] result = fitter.fit(points.toList());

        // 输出拟合后的公式
        String fun = "f(x) = ";
        for (int i = result.length - 1; i >= 0; i--) {
            String add = result[i] > 0 ? "+" : "";
            String x = i > 0 ? "x^" + i : "";
            if (i == result.length - 1) {
                fun += (result[i] + x);
            } else {
                fun += (add + result[i] + x);
            }
        }
        System.out.println("拟合公式为:"+fun);
        return result;
    }

    @Override
    public void printResult(Object result) {
        for (double data : (double[]) result) {
            System.out.println(data);
        }
    }

    private double calcPoly(double x, double[] factor) {
        double y = 0;
        for (int deg = 0; deg < factor.length; deg++) {
            y += Math.pow(x, deg) * factor[deg];
        }
        return y;
    }

 

标签:曲线拟合,index,多项式,System,result,double,public,out
From: https://www.cnblogs.com/luoxh-whn/p/18239734

相关文章

  • 【机器学习300问】108、什么是多项式回归模型?
    一、多项式回归是什么(1)举例说明        假设你经营着一家农场,想要根据土地面积来预测作物的产量。如果你只用线性模型(即),你可能会发现它并不足以描述实际的产量情况,因为实际产量可能会随着土地面积的增加而经历先快速增加然后趋于平缓的过程。线性回归模型......
  • 两个一元多项式运算
    给定两个一元多项式和一个运算符号【+、-、*】,请编写程序实现对应运算符号的两个一元多项式的运算,并输出结果。输入描述:第一行给出第一个多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数k_i和指数x_i(绝对值均为不超过1000的整数)第二行给出第二个多项式非零项......
  • [NOIP2009 普及组] 多项式输出
    题目描述一元 ......
  • OOP一元多项式类(运算符重载)
    题目描述一元多项式按照升幂表示为:Pn(x)=p0+p1x+p2x2+…+pnxn。(n>=0)构建一元多项式类保存多项式中每项的系数和指数。并重载输入输出运算符,完成多项式的输入以及输出;重载加法,减法,乘法运算符,完成多项式的运算。输入测试数据数对于每组测试数据第一行,第一个多项......
  • CSP历年复赛题-P1067 [NOIP2009 普及组] 多项式输出
    原题链接:https://www.luogu.com.cn/problem/P1067题意解读:模拟法依次输出多项式内容即可,但是需要考虑的周全,主要有以下关键点:1、系数为0时不输出多项式2、第一个符号,只有负号才输出3、次数不为0时,不输出为1的系数;次数为0时,输出所有系数4、次数为1时,不输出次数;次数为0时不输......
  • 多项式进阶操作
    多点求值问题:给定一个\(n-1\)次多项式\(f(x)\),求在\(a_0,a_2,...,a_{m-1}\)处分别求得的点值。\(n,m\le10^5\)首先我们先钦定\(n=m\),否则也可以适当补,下文中用\(n\)来代替\(m\)。设\(F=[f_0,f_1,...,f_{n-1}]\),\(A=\begin{bmatrix}a_0^0&a_0^1&...&a_0^{n......
  • 普通/下降幂多项式平移
    【普通多项式】已知\(f(x)=\displaystyle\sum_{i=0}^{n}a_ix^i\),求\(f(x+c)\)的系数。\[\begin{aligned}f(x+c)&=\sum_{i=0}^na_i(x+c)^i\\&=\sum_{i=0}^na_i\sum_{j=0}^i{i\choosej}x^jc^{i-j}\\&=\sum_{j=0}^n\dfrac{x^j}{j!}\sum_{i=j}^{n}i!......
  • 多项式基本技术整理
    FFT/NTT以\(\Theta(\mathsf{M}(n))=\Theta(n\logn)\)的复杂度,快速计算多项式在\(n\)个单位根处的点值,以及通过\(n\)个单位根处的点值还原多项式的算法。常用于计算多项式乘法。由于这个算法的原理在OI中是相当板的存在,就不在这里列出了。计算多项式乘法基本只需要......
  • 多项式
    积性函数1.利用欧拉筛求f(1),……,f(n)//欧拉筛求f(1),……,f(n)voideuler{ f[1]=1; for(inti=2;i<=n;i++){ if(!st[i])p[++tot]=i,f[i]=calc_f(i,1); for(intj=1;j<=tot&&i*p[j]<=n;j++){ st[i*p[j]]=true; if(i%p[j]==0){ cnt[i*p[j]]=cnt[i]+1;//cnt......
  • [多项式] FFT小计
    引入给出两个多项式\(A,B\),计算它们相乘的结果。我们能轻易写出code:for(inti=0;i<=n;i++) for(intj=0;j<=n;j++) C[i+j]+=A[i]*B[j];然后超时了。FFT是一种将多项式乘法优化成\(O(n\logn)\)的神仙算法。分析上面的式子没有任何优化空间。什么意思呢?就是怎......