文章目录

  • 一、泰勒公式
  • 二、思路分析
    • 1.sin函数的泰勒展开式:
    • 2.弧度制计算
    • 3.设定常量
  • 三、完整代码

一、泰勒公式

单片机如果不调用库,只进行加减运算,亦或宽泛点来说能进行加减乘除运算,那不调用库如何进行三角函数的计算呢?这时我们引入泰勒公式。

泰勒公式用一句话描述:就是用多项式函数去逼近光滑函数。

由于用多项式表示的函数,只要对自变量进行有限次加、减、乘三种算数运算,便能求出它的函数值来,因此我们常用多项式来近似表达函数。

二、思路分析

1.sin函数的泰勒展开式:


s i n x = x − x 3 3 ! + x 5 5 ! − . . . + ( − 1 ) k − 1 x 2 k − 1 2 k − 1 ! + . . . sinx=x-\frac{x^{3}}{3!}+\frac{x^{5}}{5!}-...+{(-1)^{k-1}}\frac{x^{2k-1}}{2k-1!}+... sinx=x−3!x3​+5!x5​−...+(−1)k−12k−1!x2k−1​+...


令 a 1 = x , a 2 = x 3 3 ! , a 3 = x 5 5 ! , . . . , a_{1}=x,a_{2}=\frac{x^{3}}{3!},a_{3}=\frac{x^{5}}{5!},..., a1​=x,a2​=3!x3​,a3​=5!x5​,...,

a k − 1 = ( − 1 ) k − 2 x 2 k − 3 ( 2 k − 3 ) ! , a k = ( − 1 ) k − 1 x 2 k − 1 ( 2 k − 1 ) ! , k = 1 , 2 , 3 , . . . , n a_{k-1}={(-1)^{k-2}}\frac{x^{2k-3}}{(2k-3)!},a_{k}={(-1)^{k-1}}\frac{x^{2k-1}}{(2k-1)!},k=1,2,3,...,n ak−1​=(−1)k−2(2k−3)!x2k−3​,ak​=(−1)k−1(2k−1)!x2k−1​,k=1,2,3,...,n

则 s i n x = a 1 + a 2 + a 3 + . . . + a k − 1 + a k + . . . sinx=a_{1}+a_{2}+a_{3}+...+a_{k-1}+a_{k}+... sinx=a1​+a2​+a3​+...+ak−1​+ak​+...,且

a 2 = ( − 1 ) ∗ a 1 ∗ x 2 2 ∗ 3 , a 3 = ( − 1 ) ∗ a 2 ∗ x 2 4 ∗ 5 , . . . a_{2}=(-1)*a_{1}*\frac{x^{2}}{2*3},a_{3}=(-1)*a_{2}*\frac{x^{2}}{4*5},... a2​=(−1)∗a1​∗2∗3x2​,a3​=(−1)∗a2​∗4∗5x2​,...


a k = ( − 1 ) ∗ a k − 1 ∗ x 2 2 ∗ ( k − 1 ) ∗ ( 2 k − 1 ) , k = 1 , 2 , 3 , . . . , n a_{k}={(-1)}*a_{k-1}*\frac{x^{2}}{2*(k-1)*(2k-1)},k=1,2,3,...,n ak​=(−1)∗ak−1​∗2∗(k−1)∗(2k−1)x2​,k=1,2,3,...,n

也就是说,多项式下一项都可由当前项计算出来,只要知道了第一项的 x,就可以计算出之后的每一项。
代码实现:
tItem 为 a k a_{k} ak​,tRadianx,则有:

 tItem = (-1) * tItem * tRadian * tRadian / (2*(k-1) * (2 * k - 1));

之后通过循环累计求和把每一项加起来,就是sinx的值

2.弧度制计算

角度是有单位的,弧度是没有单位的,函数sinx中x属于弧度制,而我们输入的为角度,故需要将角度转换为弧度

角度转弧度的公式:

1 ° = Π / 180 ° 1°= Π/180° 1°=Π/180°

如 50° = 50 * Π / 180° ≈ 0.87

代码实现:
tRadian 为弧度,tAngle为角度,则有:

 tRadian = tAngle * PI / 180; //角度转化为弧度进行计算

3.设定常量

由于展开式中,项数有无数个,而代码在实际运行中进行无限次计算会没有尽头,这时候我们需要设定一个常量,当项数小于常量时就停止计算

项数越多,展开式就会越接近原函数,所以这个常量越小,所计算出的结果越精确

代码实现:
tvalue 为常量,则有:

 #define tvalue 1e-8        //定义一个常量,来控制精度

这里1e-8为 1 0 − 8 10^{-8} 10−8,可根据需求来改。

三、完整代码

#include<stdio.h>
#include<math.h>
#define tvalue 1e-8        //定义一个常量,来控制精度
#define PI     3.1415926   //圆周率
void main()
{double  tSum = 0, tItem = 0;//tSum:求和(和即sin的值), tItem:每一项double  tAngle, tRadian;    //tAngle:输入的角度,tRadian:弧度int k = 1;                  //式子的右下标printf("请输入角度:");scanf("%lf", &tAngle);tRadian = tAngle * PI / 180; //角度转化为弧度进行计算tItem   = tRadian;           //输入的角度等于第一项while (fabs(tItem) > tvalue) //如果项的绝对值大于我们定义的常量,则进入循环{tSum += tItem;  //和等于每一项相加k += 1;         //式子的右下标tItem    = (-1) * tItem  * tRadian * tRadian / (2*(k-1) * (2 * k - 1));
//原式为:下一项 = (-1) * 这一项 *    x    *   x     / (2*(k-1) * (2 * k - 1))}printf("sin(%.lf)= %.2lf", tAngle, tSum);getchar();//让程序暂停,查看结果
}

C语言sin函数实现(基于泰勒公式)相关推荐

  1. c语言sin函数近似值,用泰勒公式求sin(x)的近似值

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #define PI 3.1415927 double FACT(double x); double fact(int ...

  2. c语言sin函数返回nan,C语言入口函数和LD_PRELOAD环境变量

    零.C语言入口函数 从第一天学习C语言开始,我们的脑子里就深深烙下这样一个概念:C语言程序总是从main()函数开始执行,main()函数结束,程序也就结束了.在平时的练习中貌似这没有问题,但事实真的 ...

  3. C语言sin()函数绘制正弦曲线代码(0-2π)

    本文实现y=sin(x)正弦曲线在0-2π范围内的曲线图形,如下图所示: 完整C语言代码: #include<stdio.h> #include<math.h> main() ...

  4. c语言sprintf函数 long,基于C语言sprintf函数的深入理解

    printf 可能是许多程序员在开始学习C语言时接触到的 第二个函数(我猜第一个是main),说起来,自然是老朋友了,可是,你对这个老朋友了解多吗?你对它的那个孪生兄弟sprintf了解多吗?在将各种 ...

  5. 用泰勒公式编写一个sin函数--C语言

    通过麦格劳林展开式,来编写一个sin函数,C语言内置了三角函数,这个三角函数在   #include<math.h>  的头文件下要输入角度数,是有着需要先将角度转化为弧度在进行使用,我编 ...

  6. R语言with函数和within函数:with函数基于表达式在dataframe上计算、within函数基于表达式在dataframe上计算并修改原始数据

    R语言with函数和within函数:with函数基于表达式在dataframe上计算.within函数基于表达式在dataframe上计算并修改原始数据 目录

  7. 【小程序】C语言实现简易钢琴-利用sin函数构造不同频率波形模拟各琴键发音

    根据钢琴音调频率对照表,使用sin函数构造对应频率正弦波数据模拟各琴键声音,实现简易钢琴效果,结果写入wav文件中. 目录 程序效果 实现过程 样例代码 测试用例 参考资料 程序效果 截图1:键位图 ...

  8. R语言使用epiDisplay包的alpha函数计算dataframe数据中指定数据列之间的信度分析、使用alpha函数和基于业务筛选的数据列的列表计算Cronbach‘s α

    R语言使用epiDisplay包的alpha函数计算dataframe数据中指定数据列之间的信度分析.使用alpha函数和基于业务筛选的数据列的列表计算Cronbach's α 目录

  9. 使用go语言画出sin函数图像

    sin函数图像--go语言 步骤 创建底图对象 画sin图 保存图像到文件 图片展示 步骤 创建一张底色为白色的图片对象 画出sin图像 保存到文件中 创建底图对象 //设置图片尺寸 pir := i ...

最新文章

  1. PHP实现MVC开发: 一个简单的MVC(转)
  2. 像写SQL一样编写Java数据应用-TinySqlDsl
  3. Linux查看进程和进程管理
  4. arcsde服务启动不了
  5. Java基础知识总结(一)
  6. Notepad++安装教程
  7. SPI动态加载配置文件
  8. PHP的Composer install、require、update
  9. python核心编程第六章练习6-12
  10. java中反射机制通过字节码文件对象获取字段和函数的方法
  11. the sdk seems invalid._直播平台中必不可少的美颜SDK
  12. 回溯法遵循深度优先吗_回溯算法(一)
  13. 并查集——营救(洛谷 P1396)
  14. SQL Server 2008空间数据应用系列七:基于Bing Maps(Silverlight) 的空间数据展现
  15. 尚硅谷面试第一季-21消息队列在项目中的应用
  16. 高通IPQ5018,QSDK V11.5版本手动编译指南-64位
  17. seaweedfs使用说明
  18. LeetCode 打家劫舍题型 解析
  19. 电子书籍检索下载很好的网站推荐
  20. Android Studio中的keystore

热门文章

  1. 文本相似性计算之编辑距离详解
  2. 死锁、活锁和饿死的理解(转)
  3. The Little Book of Semaphores 信号量小书 第四章 经典同步问题 4.3 无饿死互斥
  4. linux怎么退出tail命令,Linux系统tail命令怎么使用
  5. 计算机可以配置不同的显示系统,为什么Win7系统显卡显示型号和电脑配置型号不一样...
  6. 如何零基础快速开发上手app,成为app开发高手
  7. redis性能监控(一): Redis Info 命令 - 获取 Redis 服务器的各种信息和统计数值
  8. 医院移动护理管理系统源码
  9. opencore添加Linux引导,让OpenCore的引导界面更好看,已更新详细教程
  10. 常用-30V/-100V/-150V p沟道mos管选型参数,p沟道mos选型!