打印
[技术相关]

你会在单片机上计算正弦函数吗?

[复制链接]
746|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
很多人说,会啊,引入math.h
然后调用sin()函数就行了,那么你知道math.h是怎么实现这个计算的吗?
math.h 头文件里的 sin() 函数通常是通过泰勒级数展开式来计算的,即:

sin(x) = x - x^3/3! + x^5/5! - x^7/7! + ...

这个级数展开式是在 sin() 函数的定义域内(-inf < x < inf)收敛的。

为了计算 sin(x),可以根据需要选择展开式的项数,通过循环计算每一项的值,并将它们相加。每次循环的计算公式为:

term = pow(x, n) / factorial(n);
result += sign * term;

其中,n 表示当前项的次数,sign 表示当前项的符号(每隔一项取负),factorial(n) 表示 n 的阶乘。


使用特权

评论回复

相关帖子

沙发
天灵灵地灵灵|  楼主 | 2023-4-24 13:57 | 只看该作者
#include <math.h>

double sin(double x) {
    int n = 1;
    double term = x;
    double result = term;
    double sign = -1.0;
   
    while (fabs(term) > 1e-15) {  // 控制误差范围,当某一项的绝对值小于1e-15时,停止计算
        n += 2;
        sign *= -1.0;
        term = pow(x, n) / factorial(n);
        result += sign * term;
    }
   
    return result;
}

double factorial(int n) {
    double result = 1.0;
    for (int i = 2; i <= n; i++) {
        result *= i;
    }
    return result;
}

需要注意的是,由于 sin() 函数的泰勒级数展开式在 x 越大时需要计算的项数也越多,因此这种实现方法可能会在计算较大的角度时效率较低。为了提高效率,可以考虑使用其他的算法或库函数来实现 sin() 函数。

使用特权

评论回复
板凳
earlmax| | 2023-5-7 10:42 | 只看该作者
单片机怎么实现正弦函数啊              

使用特权

评论回复
地板
maudlu| | 2023-5-7 14:09 | 只看该作者
在单片机上计算正弦函数通常需要使用数值计算方法,如泰勒级数展开、Cordic算法等。

使用特权

评论回复
5
sdCAD| | 2023-5-7 15:12 | 只看该作者
需要一个正弦函数样点表              

使用特权

评论回复
6
sanfuzi| | 2023-5-7 15:18 | 只看该作者
可编程性强、精度高、计算速度快算法是哪种呢

使用特权

评论回复
7
cashrwood| | 2023-5-7 15:54 | 只看该作者
采用迭代的方式计算正弦或余弦函数的值

使用特权

评论回复
8
saservice| | 2023-5-7 16:15 | 只看该作者
怎样利用单片机来改变占空比来实现方波转正弦波

使用特权

评论回复
9
youtome| | 2023-5-7 17:32 | 只看该作者
计算sin(x);和cos(x);?

使用特权

评论回复
10
modesty3jonah| | 2023-5-7 17:58 | 只看该作者
其他一些计算正弦函数的方法,如CORDIC算法。

使用特权

评论回复
11
sdlls| | 2023-5-7 18:43 | 只看该作者
如何利用单片机实现正弦函数运算?

使用特权

评论回复
12
tpgf| | 2023-5-10 13:08 | 只看该作者
不建议直接用正弦函数,因为执行时间会很久

使用特权

评论回复
13
nawu| | 2023-5-10 14:16 | 只看该作者
单片机运算能力比较弱,一般都是用算法计算高级函数的

使用特权

评论回复
14
aoyi| | 2023-5-10 14:41 | 只看该作者
为了执行时间以及效率高,通常都是把高级函数用另外的方法去做

使用特权

评论回复
15
zljiu| | 2023-5-10 15:05 | 只看该作者
如果精度不需要很高(例如精确到1度),可以做表,把1度到90度的正弦值全部自己算出来,然后做成表,通过查表方法就可以得到结果,这样虽然写程序是麻烦,但是执行速度和效率都高

使用特权

评论回复
16
gwsan| | 2023-5-10 16:05 | 只看该作者
C语言虽然是很灵活,但是也要看是什么CPU,是根据CPU选择高效率的数据类型以及算法

使用特权

评论回复
17
tfqi| | 2023-5-10 16:26 | 只看该作者
正弦计算需要用用单片做开方运算,对单片机来说是一件非常残酷的事情

使用特权

评论回复
18
豌豆爹| | 2023-7-14 10:08 | 只看该作者
如何单片机实现正弦函数运算?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

174

主题

3361

帖子

13

粉丝