[技术相关] 你会在单片机上计算正弦函数吗?

[复制链接]
1295|17
 楼主| 天灵灵地灵灵 发表于 2023-4-24 13:56 | 显示全部楼层 |阅读模式
很多人说,会啊,引入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 | 显示全部楼层
  1. #include <math.h>

  2. double sin(double x) {
  3.     int n = 1;
  4.     double term = x;
  5.     double result = term;
  6.     double sign = -1.0;
  7.    
  8.     while (fabs(term) > 1e-15) {  // 控制误差范围,当某一项的绝对值小于1e-15时,停止计算
  9.         n += 2;
  10.         sign *= -1.0;
  11.         term = pow(x, n) / factorial(n);
  12.         result += sign * term;
  13.     }
  14.    
  15.     return result;
  16. }

  17. double factorial(int n) {
  18.     double result = 1.0;
  19.     for (int i = 2; i <= n; i++) {
  20.         result *= i;
  21.     }
  22.     return result;
  23. }

需要注意的是,由于 sin() 函数的泰勒级数展开式在 x 越大时需要计算的项数也越多,因此这种实现方法可能会在计算较大的角度时效率较低。为了提高效率,可以考虑使用其他的算法或库函数来实现 sin() 函数。
earlmax 发表于 2023-5-7 10:42 | 显示全部楼层
单片机怎么实现正弦函数啊              
maudlu 发表于 2023-5-7 14:09 | 显示全部楼层
在单片机上计算正弦函数通常需要使用数值计算方法,如泰勒级数展开、Cordic算法等。
sdCAD 发表于 2023-5-7 15:12 | 显示全部楼层
需要一个正弦函数样点表              
sanfuzi 发表于 2023-5-7 15:18 | 显示全部楼层
可编程性强、精度高、计算速度快算法是哪种呢
cashrwood 发表于 2023-5-7 15:54 | 显示全部楼层
采用迭代的方式计算正弦或余弦函数的值
saservice 发表于 2023-5-7 16:15 | 显示全部楼层
怎样利用单片机来改变占空比来实现方波转正弦波
youtome 发表于 2023-5-7 17:32 | 显示全部楼层
计算sin(x);和cos(x);?
modesty3jonah 发表于 2023-5-7 17:58 | 显示全部楼层
其他一些计算正弦函数的方法,如CORDIC算法。
sdlls 发表于 2023-5-7 18:43 | 显示全部楼层
如何利用单片机实现正弦函数运算?
tpgf 发表于 2023-5-10 13:08 | 显示全部楼层
不建议直接用正弦函数,因为执行时间会很久
nawu 发表于 2023-5-10 14:16 | 显示全部楼层
单片机运算能力比较弱,一般都是用算法计算高级函数的
aoyi 发表于 2023-5-10 14:41 | 显示全部楼层
为了执行时间以及效率高,通常都是把高级函数用另外的方法去做
zljiu 发表于 2023-5-10 15:05 | 显示全部楼层
如果精度不需要很高(例如精确到1度),可以做表,把1度到90度的正弦值全部自己算出来,然后做成表,通过查表方法就可以得到结果,这样虽然写程序是麻烦,但是执行速度和效率都高
gwsan 发表于 2023-5-10 16:05 | 显示全部楼层
C语言虽然是很灵活,但是也要看是什么CPU,是根据CPU选择高效率的数据类型以及算法
tfqi 发表于 2023-5-10 16:26 | 显示全部楼层
正弦计算需要用用单片做开方运算,对单片机来说是一件非常残酷的事情
豌豆爹 发表于 2023-7-14 10:08 | 显示全部楼层
如何单片机实现正弦函数运算?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

183

主题

3475

帖子

13

粉丝
快速回复 在线客服 返回列表 返回顶部