求一个一元函数的拟合代码
要求用Java实现,且不能使用三方库
函数为:y = a*cos(bx)*sin(cx) + d*x + e

解决方案 »

  1.   

    用Java自带的math包
      

  2.   

    关键就是求三角函数,用三角函数的近似公式,按一定的精度来求
    for example//y = a*cos(bx)*sin(cx) + d*x + e
    double fx(double x, double a, double b, double c, double d, double e) {
        return a*cos(b*x)*sin(c*x) + d*x +e;
    } //cos(x)的近似公式:1-x^2/2!+x^4/4!-x^6/6!...
    double cos(double x, int n) { //n为循环次数,看精度要求调整
        double s = 1.0, m=1.0, f=-1.0, x2=1.0;
        for (int i=0, j=0; i<n; i++) {
            for (; j<2*(i+1); j++) {
                m *= (i+1); //阶乘
                x2 *= x; //乘方
            }
            s += f*x2/m
            f = -f;
        }
        return s;
    } //sin(x)的近似公式:x-x^3/3!+x^5/5!-x^7/7!...
    double sin(double x, int n) { //n为循环次数,看精度要求调整
        double s = x, m=1.0, f=-1.0, x2=x;
        for (int i=0, j=0; i<n; i++) {
            for (; j<2*(i+1); j++) {
                m *= (i+2); //阶乘
                x2 *= x; //乘方
            }
            s += f*x2/m;
            f = -f;
        }
        return s;
    }
      

  3.   

    上面有小失误,m *= (i+1);改为m *= (j+1); //阶乘,用j控制循环,同样m *= (i+2); 也改成m *= (j+2);
      

  4.   

    线性拟合你应该去找点数学系的论坛问问。而且这更像是MathLab干的活。
    你是准备要一个什么效果,把输入输出说明白一点,是准备输入一系列的点坐标然后算出一个一元方程式吗