问题标签 [numerical-analysis]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
108 浏览

batch-file - 运行批处理文件而不打印变量声明 [octave]

我正在使用八度音阶的脚本文件。问题是当我声明大矩阵时它会变得非常混乱,因为它将它们打印到命令提示符上。

有没有一种简单的方法可以防止这种情况发生?

0 投票
1 回答
2918 浏览

python - Python 中 scipy.optimize.curve_fit 的数值精度

我在 python 中遇到了 scipy.optimize.curve_fit 函数的数值准确性问题。在我看来,当我想要 ~ 15 位数时,我只能获得 ~ 8 位数的准确度。我有一些从以下数据创建中获得的数据(此时是人工创建的):

在此处输入图像描述

其中术语 1 ~ 10^-3,术语 2 ~ 10^-6,术语 3 是 ~ 10^-11。在数据中,我A随机变化(这是一个高斯错误)。然后我尝试将其拟合到模型中:

在此处输入图像描述

其中 lambda 是一个常数,我只适合alpha(它是函数中的一个参数)。现在我希望看到 和 之间的线性关系alphaA因为数据创建中的项 1 和 2 也在模型中,所以它们应该完全取消;

在此处输入图像描述

所以;

在此处输入图像描述

然而,对于小的A(~10^-11 及以下)会发生什么,alpha不会随 缩放A,也就是说,随着A变得越来越小,alpha趋于平稳并保持不变。

作为参考,我称之为: op, pcov = scipy.optimize.curve_fit(model, xdata, ydata, p0=None, sigma=sig)

我的第一个想法是我没有使用双精度,但我很确定 python 会自动创建双精度数字。然后我认为这是文档的问题,可能会切断数字?无论如何,我可以把我的代码放在这里,但它有点复杂。有没有办法确保曲线拟合功能保存我的数字?

非常感谢你的帮助!

编辑:以下是我的代码:

0 投票
2 回答
651 浏览

c - R使用什么算法来计算平均值?

我很想知道 R 的平均函数使用什么算法。该算法的数值属性是否有一些参考?

我在 summary.c:do_summary() 中找到了以下 C 代码:

这似乎是直截了当的意思:

然后它添加了我假设的数字校正,这似乎是与数据平均值的平均差异:

我无法在任何地方追踪这个算法(平均值不是一个很好的搜索词)。

任何帮助将非常感激。

0 投票
6 回答
1049 浏览

c++ - 平方差的数值精度

在我的代码中,我经常计算如下部分(为简单起见,这里是 C 代码):

对于此示例,请忽略平方根的参数可能由于不精确而为负。我通过额外的fdimf电话解决了这个问题。但是,我想知道以下是否更准确:

cos_theta介于两者之间-1+1因此对于每个选择,都会有我减去相似数字的情况,因此会降低精度,对吧?什么是最精确的,为什么?

0 投票
3 回答
285 浏览

performance - Haskell 性能:难以利用分析结果和基本调优技术(消除显式递归等)

我在玩 Haskell 的过程中休息了一段时间,现在我开始重新投入使用。我肯定还在学习这门语言。我意识到,在编写 Haskell 时总是让我感到紧张/不舒服的一件事是,我对如何制作既惯用高效的算法没有深入的了解。我意识到“过早的优化是万恶之源”,但同样缓慢的代码最终将不得不被处理,而且我无法摆脱我对高级语言超级慢的先入为主的观念。

因此,本着这种精神,我开始使用测试用例。我正在研究的其中一个是经典的 4 阶龙格-库塔方法的简单、直接的实现,应用于相当简单的 IVP dy/dt = -y; y(0) = 1,它给出了y = e^-t. 我用 Haskell 和 C 编写了一个完全直接的实现(稍后我会发布)。Haskell 版本非常简洁,当我看到它时,它的内部给了我温暖的模糊感,但是 C 版本(实际上解析起来并不可怕快了一倍多。

我意识到比较两种不同语言的性能并不是 100% 公平的。并且直到我们都死去的那一天,C 很可能永远保持性能之王的桂冠,尤其是手工优化的 C 代码。我不想让我的 Haskell 实现运行得和我的 C 实现一样快。但我很确定,如果我更清楚自己在做什么,那么我可以从这个特殊的 Haskell 实现中获得更快的速度。

Haskell 版本是-02在 OS X 10.8.4 上的 GHC 7.6.3 下编译的,C 版本是用 Clang 编译的,我没有给它任何标志。使用 跟踪时,Haskell 版本的平均时间约为 0.016 秒time,而 C 版本的平均时间约为 0.006 秒。

这些时间考虑了二进制文件的整个运行时间,包括输出到标准输出,这显然占了一些开销,但我确实通过重新编译和运行以及查看 GC对 GHC 二进制文件进行了一些分析统计数据。我并没有真正理解我所看到的所有内容,但似乎我的 GC 并没有失控,尽管可能会得到一点控制(5%,生产力在 ~93% 用户,~85 % total elapsed) 并且大部分生产时间都花在了 function上,当我写它的时候我知道这会很慢,但是对我来说如何去清理它并不是很明显。我意识到我在使用列表时可能会受到惩罚,无论是在常量-prof -auto-all+RTS -p+RTS -siterateRKconsing 以及将结果转储到标准输出的懒惰。

我到底做错了什么?我悲惨地不知道我可以用来清理哪些库函数或 Monadic 魔法iterateRK?学习如何成为 GHC 分析摇滚明星有哪些好的资源?

RK.hs

RK.c

0 投票
1 回答
96 浏览

numerical-analysis - 如何高效准确地数值计算非线性多项式?

(我不确定我是否应该在这个网站或数学网站上发布这个问题。如有必要,请随时迁移此帖子。)

我手头的问题是,给定一个值,k我想用数值计算非线性多项式的有理函数,k如下所示:(对不起,我不知道如何在这里排版方程......)复数常数 在哪里{a_0, ..., a_N; b_0, ..., b_N},{u_0, ..., u_N, v_0, ..., v_N} 是实常数,i是虚数。我从Numerical Recipes中了解到,如果所有系数都保持不变,那么有很多方法可以快速计算多项式,同时保持舍入误差足够小。但我认为这些想法在我的情况下没有用,因为指数前因数也取决于k.

目前我在 C 中以蛮力的方式计算它complex.h(这只是一个伪代码):

但是,当调用次数function增加时(因为这只是我实际计算的一部分),它非常缓慢且不准确(只有 6 个有效数字)。我感谢任何意见和/或建议。

0 投票
3 回答
162 浏览

c++ - 函数作为 C++ 中的输入

我正在用 C++为牛顿法编写一个函数。
我希望能够指定要在算法中使用的函数,但我希望它作为输入。

例如:

其中fdf分别是函数及其导数

但是我该怎么做呢?

0 投票
0 回答
281 浏览

floating-accuracy - 补偿求和中的相对误差

我已经为随机生成的双精度数据实现了 Kahan 的补偿总和(http://en.wikipedia.org/wiki/Kahan_summation_algorithm)算法,并且需要计算相对误差。

根据各种论文,为了计算相对误差,我们需要精确的总和。我的问题是如何计算精确的总和?我们可以使用 MPFR 等扩展精度库计算精确的总和吗?

如果无法计算精确的总和,那么如何计算相对误差?

或者相对误差计算为 (kSum-recSum)/kSum,其中 kSum 是使用 Kahan 方法计算的总和,recSum 是浮点数的递归总和?但这似乎不对。

0 投票
4 回答
20634 浏览

matlab - 为什么 inv() 和 pinv() 在 Matlab 和 Octave 中的输出不相等?

我注意到如果 A 是 NxN 矩阵并且它具有逆矩阵。但是 inv() 和 pinv() 函数的输出是不同的。- 我的环境是 Win7x64 SP1、Matlab R2012a、Cygwin Octave 3.6.4、FreeMat 4.2

看看 Octave 的例子:

  • ans通过在 Matlab 中运行上述相同的命令,结果都是一样的。

  • 我计算inv(A)*Aor A*inv(A),结果是 Octave 和 Matlab 中的单位 3x3 矩阵。
  • 和的结果是 MatlabA*pinv(A)pinv(A)*AFreeMat 中的身份 3x3 矩阵。
  • 结果A*pinv(A)是 Octave 中的单位 3x3 矩阵。
  • 结果pinv(A)*A不是Octave 中身份 3x3 矩阵。

我不知道为什么inv(A) != pinv(A),我已经考虑了矩阵中元素的细节。似乎是导致此问题的浮动精度问题。

点后的 10+ 位可能会有所不同,如下所示:

  • 6.65858991579923298331777914427220821380615200000000inv(A)(1,1)反对的元素

  • 6.65858991579923209513935944414697587490081800000000元素在pinv(A)(1,1)

0 投票
2 回答
11501 浏览

c++ - 查找总和除以给定数字的数组的子数组的数量

我陷入了一个算法问题。请为以下问题建议一些有效的算法。

问题是

查找总和可被给定数字整除的子数组的数量。

我的工作

我做了一个算法,它的复杂度是 O(N^2),这里,N = 数组的大小。

我的代码