这些只是一些快速而肮脏的建议 . 希望有人会发现它们有用!

1. Do you have a symbolic function or a set of points?

如果您有符号功能,您可以分析计算衍生物 . (很可能,如果那么容易的话,你会做到这一点,你不会在这里寻找替代品 . )

如果您具有符号函数且无法通过分析计算导数,则可以始终在一组点上评估函数,并使用此页面上列出的其他方法来评估导数 .

在大多数情况下,你有一组点(xi,fi),并且必须使用以下方法之一....

2. Is your grid evenly or unevenly spaced?

如果网格间隔均匀,您可能需要使用有限差分格式(请参阅维基百科文章here或here),除非您使用的是周期性边界条件(见下文) . Here是在解决网格上的常微分方程的背景下对有限差分方法的一个不错的介绍(特别参见幻灯片9-14) . 这些方法通常在计算上有效,易于实现,并且该方法的误差可以简单地估计为用于导出它的泰勒展开的截断误差 .

如果您的网格间距不均匀,您仍然可以使用有限差分格式,但表达式更加困难,并且精度随着网格的统一程度而变化很大 . 如果您的网格非常不均匀,您可能需要使用较大的模板尺寸(更多相邻点)来计算给定的导数点 . 人们经常构造插值多项式(通常是Lagrange polynomial)并区分该多项式来计算导数 . 例如,参见this StackExchange问题 . 使用这些方法通常很难估计错误(尽管有些人试图这样做:here和here) . Fornberg's method在这些情况下通常非常有用....

必须注意您域名的边界,因为模板通常涉及域外的点 . 有些人引入"ghost points"或将边界条件与不同阶数的导数组合以消除这些并简化模板 . 另一种方法是使用右侧或左侧有限差分方法 .

Here's一种优秀的有限差分方法,包括低阶的中心,右侧和左侧方案 . 我在工作站附近打印出这个,因为我发现它非常有用 .

3. Is your domain periodic? Can you assume periodic boundary conditions?

如果您的域是周期性的,您可以使用傅里叶谱方法计算导数到非常高的阶数 . 这种技术在某种程度上牺牲了性能以获得高精度 . 实际上,如果您使用的是N点,那么您对导数的估计大约是第N阶的准确度 . 有关更多信息,请参阅(例如)this WikiBook .

傅立叶方法通常使用快速傅立叶变换(FFT)算法来实现大致O(N log(N))性能,而不是天然实现的离散傅立叶变换(DFT)可能采用的O(N ^ 2)算法 .

如果您的函数和域不是周期性的,则不应使用傅里叶谱方法 . 如果您尝试将其与非周期性函数一起使用,则会出现大的错误和不良的"ringing"现象 .

计算任何阶数的导数需要1)从网格空间到光谱空间的变换(O(N log(N))),2)傅里叶系数乘以其光谱波数(O(N)),和2)从光谱空间到网格空间的逆变换(再次为O(N log(N))) .

在将傅里叶系数乘以其光谱波数时必须小心 . FFT算法的每个实现似乎都有自己的频谱模式和归一化参数的排序 . 例如,请参阅Math StackExchange上this question的答案,以获取有关在MATLAB中执行此操作的说明 .

4. What level of accuracy are you looking for? Do you need to compute the derivatives within a given tolerance?

出于许多目的,一阶或二阶有限差分方案可能就足够了 . 为了获得更高的精度,您可以使用更高阶的泰勒展开式,从而降低高阶项 .

如果需要计算给定容差范围内的导数,可能需要查看具有所需错误的高阶方案 .

通常,减少误差的最佳方法是在有限差分方案中减少网格间距,但这并非总是可行的 .

请注意,高阶有限差分格式几乎总是需要更大的模板尺寸(更多的相邻点) . 这可能会导致边界问题 . (参见上面关于鬼点的讨论 . )

5. Does it matter to you that your derivative is evaluated on the same points as your function is defined?

MATLAB提供 diff 函数来计算相邻数组元素之间的差异 . 这可以用于通过一阶前向差分(或前向有限差分)方案来计算近似导数,但估计是低阶估计 . 如MATLAB的 diff (link)文档中所述,如果输入长度为N的数组,它将返回一个长度为N-1的数组 . 当您在N点上使用此方法估计导数时,您只能估算出N-1点的导数 . (请注意,如果它们按升序排序,则可以在不均匀网格上使用 . )

在大多数情况下,我们希望在所有点评估衍生物,这意味着我们想要使用除 diff 方法之外的其他东西 .

6. Do you need to calculate multiple orders of derivatives?

可以 Build 一个方程组,其中网格点函数值和这些点上的一阶和二阶导数都相互依赖 . 这可以通过像往常一样在相邻点处组合泰勒展开来找到,但是保持导数项而不是将它们抵消,并将它们与相邻点的那些连接在一起 . 这些方程式可以通过线性代数求解,不仅可以得到一阶导数,也可以得到第二个导数(或者更高阶,如果设置得当) . 我相信这些被称为组合有限差分方案,它们通常与紧致有限差分方案结合使用,这将在下面讨论 .

紧凑有限差分格式(link) . 在这些方案中, Build 一个设计矩阵并通过矩阵求解同时计算所有点的导数 . 它们被称为"compact"因为它们通常被设计为需要比具有可比精度的普通有限差分方案更少的模板点 . 因为它们涉及将所有点连接在一起的矩阵方程,确定据说紧凑有限差分方案具有"spectral-like resolution"(例如Lele's 1992 paper - 优秀!),这意味着它们通过依赖于所有节点值来模拟频谱方案,并且因此,它们在所有长度尺度上保持准确性 . 相反,典型的有限差分方法仅局部精确(例如,点#13处的导数通常不依赖于点#200处的函数值) .

目前的研究领域是如何在紧凑的模板中最好地解决多种衍生物 . 这种研究,组合,紧凑的有限差分方法的结果是强大的和广泛适用的,尽管许多研究人员倾向于针对特定需求(性能,准确性,稳定性或诸如流体动力学的特定研究领域)调整它们 .

Ready-to-Go Routines

如上所述,可以使用 diff 函数(文档link)来计算相邻数组元素之间的粗略导数 .

MATLAB的 gradient 例程(link到文档)是一个很好的选择,用于许多目的 . 它实现了二阶中心差分方案 . 它具有计算多维导数并支持任意网格间距的优点 . (感谢@thewaywewalk指出这个明显的遗漏!)

我用Fornberg的方法(见上文)开发了一个小程序( nderiv_fornberg )来计算任意网格间距的一维的有限差分 . 我觉得它很容易使用 . 它在边界处使用6个点的侧面模板,在内部使用中心的5点模板 . 它可以在MATLAB File Exchange here中找到 .

Conclusion

数值微分领域非常多样化 . 对于上面列出的每种方法,有许多变体具有各自的优点和缺点 . 这篇文章几乎不是数值微分的完整处理 .

每个应用程序都不同 . 希望这篇文章能够为感兴趣的读者提供有组织的考虑因素和资源清单,以便选择适合自己需要的方法 .

可以使用特定于MATLAB的代码片段和示例来改进此社区wiki .

java 求导函数_在MATLAB中计算数值导数的最佳方法是什么?相关推荐

  1. react中绑定点击事件_在React中绑定事件处理程序的最佳方法

    react中绑定点击事件 by Charlee Li 通过李李 在React中绑定事件处理程序的最佳方法 (The best way to bind event handlers in React) ...

  2. java 求导函数_面向对象编程 —— java实现函数求导

    文章目录 首先声明一点,本文主要介绍的是面向对象(OO)的思想,顺便谈下函数式编程,而不是教你如何准确地.科学地用java求出函数在一点的导数. ★引子 defd(f) :defcalc(x) : d ...

  3. matlab中读文件的行数_[转载]MATLAB中获取大型文本文件行数方法研究(转)

    在工作中会有很多特殊的需要,比如我现在就遇到一个需要将大型的文本格式数据文件(比如5G)读取到MATLAB中,同时进行一定的处理.由于XP的内存是绝对没有办法将5G的数据一次性加载到工作空间的,此时一 ...

  4. python删除字符串中重复字符_从Python中删除字符串标点符号的最佳方法

    似乎有一个比以下更简单的方法: 1 2 3import string s ="string. With. Punctuation?" # Sample string out = s ...

  5. java 求导函数_求导程序编写(oo-java编程)

    本单元的任务为求导. 即将一个含自变量x的多项式F求导成为另外一个含自变量x的多项式f.使得 dF/dx = f 为降低我们的难度,这个任务被分解成了三个阶段: (1)对幂函数进行求导(不允许嵌套) ...

  6. python求雅可比矩阵_在Python中计算神经网络的雅可比矩阵

    通常,神经网络是一个多变量,矢量值函数,如下所示: 函数f有一些参数θ(神经网络的权重),它将一个N维向量x(即猫图片的N像素)映射到一个m维矢量(例如,x属于M个不同类别中的每个类别的概率): 在训 ...

  7. python计算余弦距离_在Python中计算余弦距离的优化方法

    如果可以使用SciPy,可以使用spatial.distance中的余弦值: 如果您不能使用SciPy,您可以尝试通过重写Python来获得一个小的加速(编辑:但是没有像我以前想像的那样工作,见下文) ...

  8. java web 下拉列表_关于web中下拉列表的几种实现方法

    从数据库中获得数据List,将数据放到Request里面使用setAttribute("AList",AList) A中有2个属性(String id,String value) ...

  9. matlab三角形面积,matlab中计算三角形面积?

    问题描述: matlab中计算三角形面积? 在X,Y矩阵中存有一组点的x,y坐标: X=[5 7 2 8 7 4 3 6 9] ,Y=[4 5 9 3 6 5 3 2 8] 矩阵B中保存了每三个点构成 ...

最新文章

  1. RDKit | 从ChEMBL数据库提取大分子HELM单体(XML转换为DataFrame并搜索部分结构)
  2. 如何编译 Linux 内核
  3. notepad++ 设置常用快捷键
  4. 01-html介绍和head标签
  5. 怎样Selenium IDE选择combo box中值
  6. 03 Android应用界面编程
  7. python基础-类的继承
  8. 解决python-kafka连接kafka时报错kafka.errors.NoBrokersAvailable: NoBrokersAvailable
  9. graphics | 基础绘图系统(五)——plot函数功能再探和低级绘图函数
  10. 编写Android.mk中的LOCAL_SRC_FILES,使其自动查找源文件,不需要手动添加
  11. java 调用gpu_GPU使用设置
  12. python重要性_基于Python的随机森林特征重要性图
  13. 偏微分方程的引入及概述
  14. goldfish安装
  15. GPS研究---GPS 数据格式
  16. 前端JQuery插件distpicker.js的部分操作使用
  17. java rgb yuv_RGB,CMY(K),YUV,YIQ,YCbCr顏色的轉換算法(java實現)
  18. 天天对着代码没事也谢谢博客
  19. c语言sqlite3写数据类型,在sqlite数据库中,int类型不等于integer数据类型
  20. 移动硬盘无法读取,也无法显示?看高手是怎么恢复的

热门文章

  1. 第一天-电商行业的背景,淘淘商城的介绍,搭建项目工程,svn的使用
  2. 入职一年的收获与体会
  3. markdown在线生成html,markdown生成一份html简历
  4. Android开发初期之后怎么提升?怎么才能叫精通?方向在哪?
  5. 《念奴娇·断虹霁雨》 黄庭坚
  6. 半导体器件(不定时更新)
  7. Typora 数学符号
  8. 在首席架构师眼里,架构的本质
  9. React 中的虚拟 DOM 是什么?
  10. SwiftUI 视图切换之自定义modal控制Card卡片效果