今天的CSDN问答专栏里出现了一个实战中遇到的问题:现有两组数据,一组是时间序列,一组是对应时间序列的旋转角度,请问怎样计算某一时刻的角速度呢?

时间(s) 角度(°)
192 7.085
193 10.497
194 14.019
195 17.683
196 21.487
197 25.403
198 29.402
199 33.467

显然,这是一个求导即可解决的问题。如果将时间记作t,将旋转角度记作θ,那么θ就是t的函数:

对上式求导,就得到角速度v对时间t的函数:

通常,我们把第1个公式叫做原函数,把第2个公式叫做导函数。有了原函数,利用六大基本初等函数的求导公式,或者应用复合函数求导法则,一般都可以得到导函数。

然而,本问题的原函数f(t)在哪里呢?我们手头有的,不过是两组离散的测量数据而已。漫说f(t)不见踪影,就算f(t)已经存在,倘若不是基本初等函数的话,恐怕大多数程序员也早已忘记如何求导了吧?

看起来真的是山穷水尽无从下手了。不过呢,不用担心,今天推荐一个通用的求导方法,可以帮助程序员彻底摆脱求导的困惑。这个通用方法有两个步骤:第一步是通过离散数据找到原函数,第二步是不依赖于求导公式和技巧就可以得到导函数,无论原函数有多么复杂。

1. 寻找原函数

从两组离散数据中找到它们之间的内在关系,是一个回归问题,而数据插值就是对回归函数的应用。这启发了我从scipy的插值问题中寻找回归函数。为了使方法更具通用性,下面的代码用自变量x代替时间t,用因变量y代替旋转角度θ,借助scipy模块的一维插值函数interp1d,轻松得到了本文开始给出的两组数据间隐含的函数关系。

>>> import numpy as np
>>> from scipy import interpolate
>>> _x = np.linspace(192,199,8)
>>> _y = np.array([7.085,10.497,14.019,17.683,21.487,25.403,29.402,33.467])
>>> f = interpolate.interp1d(_x, _y, kind='cubic')

这段代码最后得到的f,就是旋转角度对于时间的函数,自变量的值域范围限定在原始的时间数据的变化范围内。现在我们可以用它来计算192~199范围内任意时刻的旋转角度了。

>>> f(193.3)
array(11.54026091)
>>> f(193.35)
array(11.71517478)
>>> f(193.351)
array(11.71867619)

分别输入193.3、193.35、193.351等时刻,简单测试了一下,看上去还都挺象那么回事儿。

2. 求解导函数

原函数找是找到了,却犹抱琵琶半遮面,究竟什么模样,我们还是不得而知。没关系,下面这个通用的求导方法根本不在意原函数长什么样,只要原函数是真实存在的,就足够了。这个方法的原理,就是令自变量x在某处有一个极小的增量dx,将因变量y的增量dy与dx之比近似视为函数在该处的导数。这里默认dx=1.0X10的-10次方,如有必要,还可以将其设置为更小的数值。

>>> def get_derivative(f, delta=1e-10):"""导函数生成器"""def derivative(x):"""导函数"""return (f(x+delta)-f(x))/deltareturn derivative

这不是一个闭包函数吗?熟悉闭包的读者一眼就会看出来。没错,导函数生成器就是一个闭包函数,只要告诉它原函数,它就返回对应的导函数。用刚才得到的旋转角度关于时间的原函数来测试一下,轻松得到其导函数,也就是旋转角速度关于时间的函数。

>>> fd = get_derivative(f)

用这个导函数计算一下193.5和195.8两个时刻的角速度:

>>> fd(193.5)
3.590830143540664
>>> fd(195.8)
3.8961776076555026

至此,问题得解。

各位伙伴们好,詹帅本帅搭建了一个个人博客和小程序,汇集各种干货和资源,也方便大家阅读,感兴趣的小伙伴请移步小程序体验一下哦!(欢迎提建议)

推荐阅读

牛逼!Python常用数据类型的基本操作(长文系列第①篇)

牛逼!Python的判断、循环和各种表达式(长文系列第②篇)

牛逼!Python函数和文件操作(长文系列第③篇)

牛逼!Python错误、异常和模块(长文系列第④篇)

怎么求导来着?别费劲了,试试这个Python的通用求导法相关推荐

  1. [转载] python下求语数总分和平均值_R和python语言如何求平均值,中位数和众数

    参考链接: 在Python中计算均值,中位数和众数 均值是通过取数值的总和并除以数据序列中的值的数量来计算. R语言平均值公式: mean(x, trim = 0, na.rm = FALSE, .. ...

  2. 课程作业1-数据预处理以及 python对函数求导

    谨记第一次作业用到的内容,应该是对的吧 哈哈哈 读取数据,获取基本信息. 1. 现已使用Pandas读取数据集challenge.csv • 请提取该数据集的字段名称,将结果存为cols • 请获取给 ...

  3. python求向量函数的雅可比矩阵_在python Numpy中求向量和矩阵的范数实例

    np.linalg.norm(求范数):linalg=linear(线性)+algebra(代数),norm则表示范数. 函数参数 x_norm=np.linalg.norm(x, ord=None, ...

  4. python二维元素向量_详解python Numpy中求向量和矩阵的范数

    在python Numpy中求向量和矩阵的范数实例 np.linalg.norm(求范数):linalg=linear(线性)+algebra(代数),norm则表示范数. 函数参数 x_norm=n ...

  5. 【高等数学】函数连续、可导、可微,洛必达法则使用条件、一阶可导、一阶连续可导、二阶可导、二阶连续可导

    目录 一.一元函数连续.可导.可微之间的关系 二.洛必达的使用条件 三.洛必达使用要注意的地方 1.等式右边极限存在 2.每导一步注意检查是否满足0/0,或∞/∞ 3.求导时注意函数怎么求导更简化 四 ...

  6. puml绘制思维导图_如何用ProcessOn画出漂亮的思维导图

    说到绘制思维导图,很多人可能都知道XMind,但不一定了解ProcessOnProcessOn - 免费在线作图,实时协作,总以为后者绘制流程图很强大,殊不知其在思维导图方面也有很强大的功能. 好工具 ...

  7. python求最值_用Python实现最速下降法求极值的方法

    对于一个多元函数 ,用最速下降法(又称梯度下降法)求其极小值的迭代格式为 其中 为负梯度方向,即最速下降方向,αkαk为搜索步长. 一般情况下,最优步长αkαk的确定要用到线性搜索技术,比如精确线性搜 ...

  8. 16张思维导图+学习路线图,囊括所有Python基础,可打印

    今天给大家分享的是关于Python基础的14张思维导图,对于大家知识的梳理会有很大的帮助,另外还有两张Python学习路线图,全面系统,让初学者不走弯路.一起来看一看吧! 前面知识回顾!!!!! 程序 ...

  9. 用Python实现最速下降法求极值

    原文:https://blog.csdn.net/u012705410/article/details/47254437 用Python实现最速下降法求极值 对于一个多元函数f(x)=f(x1,x2, ...

最新文章

  1. 牛客练习赛81 B. 小 Q 与彼岸花(FWT nlogn做法)
  2. [Flex][总结]从页面url获取参数
  3. 【Linux】一步一步学Linux——pstack命令(261)
  4. 解决ssh7.4升级8.5后环境变量失效和无法登录问题
  5. 201771010118马昕璐
  6. Golang string处理
  7. 火速拿来用!对比近 10,000 个 Python 开源项目发现最实用的 TOP34!
  8. 基于PCA降维实现人脸识别
  9. BZOJ——T 1612: [Usaco2008 Jan]Cow Contest奶牛的比赛
  10. mysql msi失败_MySQL .msi 安装失败改用.zip安装步骤
  11. python tkinter教程 博客园_布同:如何循序渐进学习Python语言
  12. 小红书618品牌营销蓄水阶段告一段落,5月即将进入冲刺期
  13. 情怀——推荐梁晓声新作《未死的沙威》
  14. c语言 int 型 无符号数 %u
  15. 室内设计优美语句_关于软装设计的优美句子
  16. 为已有设备启用Windows AutoPilot(一)--先决条件
  17. 4am永远 鼠标按键设置_《搞机作战室》机械师M8鼠标怎么安装/使用控制中心
  18. DailyMart01:一起来玩DDD吧?
  19. 高校毕业论文答辩创意双色ppt模板
  20. 2017百度之星程序设计大赛-资格赛

热门文章

  1. Java中List for循环的6种写法总结(推荐)(亲测)
  2. Kibana停止kibana的方法命令:找到5601端口对应的进程ID 把此进程进行kill即可
  3. Linux中的大于号 双大于号 大于号:覆盖 追加 正确与错误都输出至指定文件
  4. Bootstrap的role
  5. PHP的Static与Global
  6. 钢铁苍穹html5,自定义网站搜索教程
  7. mysql 存储引擎接口_MySQL体系结构和存储引擎
  8. 有赞的交易系统架构困局以及破局之道
  9. MySQL使用distinct去掉查询结果重复的记录
  10. linux修改文件夹名称_1.3.2 对 Hello Word! 程序代码进行编辑修改