一元函数的拟合代码

Yale_Yange 2019-09-30 11:15:48
求一个一元函数的拟合代码
要求用Java实现,且不能使用三方库
函数为:y = a*cos(bx)*sin(cx) + d*x + e
...全文
142 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
wowpH 2019-09-30
  • 打赏
  • 举报
回复
这个怎么拟合啊。还真没见过。
「已注销」 2019-09-30
  • 打赏
  • 举报
回复
用Java自带的math包
Yale_Yange 2019-09-30
  • 打赏
  • 举报
回复
引用 6 楼 狗蛋丶 的回复:
线性拟合你应该去找点数学系的论坛问问。而且这更像是MathLab干的活。 你是准备要一个什么效果,把输入输出说明白一点,是准备输入一系列的点坐标然后算出一个一元方程式吗
是的。
qybao 2019-09-30
  • 打赏
  • 举报
回复
通过一些点来导出方程式这个有难度吧,LZ应该不是这个意思吧
应该是已知方程式,通过拟合把一些相邻的点平缓过渡期,让曲线更接近于方程式吧
狗蛋丶 2019-09-30
  • 打赏
  • 举报
回复
线性拟合你应该去找点数学系的论坛问问。而且这更像是MathLab干的活。 你是准备要一个什么效果,把输入输出说明白一点,是准备输入一系列的点坐标然后算出一个一元方程式吗
Yale_Yange 2019-09-30
  • 打赏
  • 举报
回复
引用 3 楼 qybao 的回复:
关键就是求三角函数,用三角函数的近似公式,按一定的精度来求 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;
}
我是想要拟合,不是求解。
qybao 2019-09-30
  • 打赏
  • 举报
回复
上面有小失误,m *= (i+1);改为m *= (j+1); //阶乘,用j控制循环,同样m *= (i+2); 也改成m *= (j+2);
qybao 2019-09-30
  • 打赏
  • 举报
回复
关键就是求三角函数,用三角函数的近似公式,按一定的精度来求
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;
}


62,625

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧