问题标签 [numerical-computing]

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 投票
2 回答
55 浏览

c++ - 计算重量平均值时的小数值误差

这是物理引擎中的一部分。
简化函数centerOfMass计算两个刚体的一维质心(演示):-

我需要b精确 = 5.55709743。

有时(我的真实情况= 5%)微小的差异会引入令人讨厌的物理分歧。
有一些方法可以解决它,例如大量进行一些条件检查。
但是,这对我来说非常容易出错。

问题:如何解决计算错误,同时保持代码干净、快速、易于维护?

顺便说一句,如果不能优雅地完成,我可能需要改进调用者以更能抵抗这种数字错误。

编辑

(澄清重复的问题)

是的,原因是存储/计算格式的精度错误(在Is floating point math broken?中提到)。

但是,这个问题询问如何在非常具体的情况下 消除其症状。

0 投票
1 回答
41 浏览

numerical-integration - 计算指数函数或贝塞尔函数更费力吗?

通常希望以封闭形式获得数学问题的解,即作为包含普遍接受的函数的表达式,如多项式、有理和无理函数、根、指数和对数。我经常听到的一个理由是,当涉及已知函数时,更容易可视化函数的行为。另一个理由是在一组点上评估函数的计算要求较低。虽然我当然同意第一个理由,但第二个理由合理吗?例如:

  • 计算 10 个点的一阶和五阶修正贝塞尔函数是否比计算指数需要更长的时间?

  • 计算指数积分是否比计算指数需要更长的时间?

我的直觉是,在所有三种情况下,都会形成围绕所需点的泰勒级数展开,因此归结为评估多项式、其他多项式或其反导数。

0 投票
0 回答
121 浏览

vba - A = B^n - C^n(Excel VBA:数值方法)

我有来自ABC的多次试验的日期。我得到了等式:

A = B^{n} - C^{n}

A,B,C => 0

B>C

ABC的值我想计算n

我试图创建一个使用数值方法计算 n 的 VBA 函数。

注意:有人告诉我0.5 <= n <= 1

是否存在此代码不起作用的任何情况,或者是否需要进行任何更改。

任何改进或其他解决方案都会被应用!谢谢,J

0 投票
0 回答
219 浏览

c++ - 与可变限制集成

我需要评估内部上界是可变的双积分:
integral2 between -5 and 5 ( integral1 between 0 and y f(x)dx )dy

我被困在依赖于内循环的外循环的计算中。我的代码运行了很长时间,但返回零。

如何计算具有可变限制的积分?


首先我创建了一个函数doubleIntegrate。首先,该函数保存具有梯形规则系数的数组。

0 投票
1 回答
56 浏览

matlab - 使用具有许多 0 和 1 的矩阵是否被视为矢量化?

假设对于一些需要的转换,我有一个 mxn 矩阵 A,它由几个 1 和许多 0 组成。如果我要通过 A 转换 nx1 向量,这是否被视为向量化实现?

虽然矩阵 A 主要由 0 组成,但这仍然会导致相同数量的 FLOP 发生吗?

以另一种方式进行转换会更明智、更优化吗?一种不会导致不必要的计算,例如 0*c?

0 投票
1 回答
313 浏览

if-statement - 即使满足条件,程序也不会在 Fortran 中进入 if 循环

这是未按预期运行的代码部分。我必须包含一些老式的“暂停”语句来查明错误位置。



输出如下:


的值为heun_percent_tolerance0.01 和max_heun_number15。我希望执行进入第二个 if 循环进行更多迭代,直到达到最大限制 15,但似乎代码跳转到下一个x_next值 2。

我什至尝试将这两个条件结合起来If (cond1 .and. cond2),但也没有用。

0 投票
1 回答
73 浏览

python-2.7 - 在 Python 2.7x 中声明变量以避免以后出现问题

我是 Python 新手,来自 MATLAB,很久以前来自 C。我在 MATLAB 中编写了一个脚本,将河流中的泥沙输送模拟为马尔可夫过程。该代码将随机直径的圆随机放置在指定尺寸的矩形区域内。圆圈的大小不均匀,是从指定的大小范围内随机绘制的。我不知道我会通过多少次循环放置操作,所以我使用一个while循环来完成这个过程。为了更加面向社区,我将 MATLAB 脚本翻译成 Python。我使用在线工具 OMPC 开始,并且一直在从自动翻译版本手动完成它(没有那么有用,这并不奇怪)。为了调试代码,我通常使用 MATLAB 生成的结果与 Python 中的结果进行比较和对比。我似乎很清楚,我声明变量的方式会在脚本中进行计算时引入问题。以下是不同代码执行实例之间存在一致性问题的两个示例。首先,代码生成了我认为是数组中的数组,因为脚本返回的结果如下所示:

  • 数组([[真] [假]],dtype = bool)

此结果是在overlap_logix 操作中为以下代码片段生成的:

对于变量,相同运行产生了类似的结果:

  • radius_check_update
  • 半径重叠
  • 重叠更新

这是工作 MATLAB 版本的相同代码片段(根据要求):

在 Python 版本中,我从列表创建了数组,以便更轻松地对内容进行操作(代码片段的前两行)。数组结果中的数组和创建数组以访问数据向我表明我错误地声明了变量类型,但我不确定。此外,一些变量具有大小,例如 (2L,)(数字维度会随着圆圈的放置而变化),其中没有第二维度。当我尝试将该数组与另一个大小为 (2L,1L) 的数组一起使用时,这会产生明显的问题。由于这些问题,我开始重塑数组,然后我停止了,因为我认为这些是 hack,因为我错误地声明了一个或多个变量。其次,对于同一次运行,我遇到了以下错误:

  • TypeError:“numpy.ndarray”对象不可调用

对于操作:

它出现在上述代码片段的底部。我在以下链接中发布了整个脚本,因为为自己执行脚本可能更有用:

https://github.com/smchartrand/MarkovProcess_Bedload

我已经设置了代码以使用一些初始参数值运行,因此不需要做出决定;这些参数值在基于 MATLAB 的脚本中产生预期的结果,绘制时看起来像这样:在此处输入图像描述

所以,我似乎特别遇到了第 151-165 行的操作问题,具体取决于测试值np.sum([radius_overlap])我认为这是因为我错误地声明了变量类型,但我真的不确定。我可以自信地说,Python 版本和 MATLAB 版本通过 while 循环的第一步和进入 while 循环第二步的代码行 127 的输出是一致的。在代码中的这一点以下,上述记录的问题最终会导致脚本崩溃。有时脚本执行到 15% 完成,有时它没有达到 5% - 这是由于圆圈放置的随机性。我正在 Spyder (Python 2.7) IDE 中准备代码,并将作为我研究的一部分公开分享工作代码。我将非常感谢可以提供的任何帮助,以识别我在 python 编码实践中的错误和误用。

0 投票
0 回答
574 浏览

matlab - 如何在 MATLAB 中绘制 3D 电场强度

所以基本上我试图在 MATLAB 中绘制给定点 [x,y,z] 的电场强度。我想用颜色绘制给定点的场强;例如,点 [x_1, y_1, z_1] 处的高场强将显示为深红色,点 [x_2, y_2, z_2] 处的低场强将显示为浅红色(接近场强接近零时呈白色)。场强是指 E = sqrt((E_x)^2+(E_y)^2+(E_z)^2)。

因此,对于那些计数,我要绘制 4 个“维度”:3 个空间维度(空间中的 x、y、z 坐标显示给定点的场强)和 1 个“强度维度”显示给定点的场强空间点。我想将此强度维度表示为色标。场强不应显示给定点的场方向,而应仅显示幅度,并且应将此幅度显示为给定颜色的“暗度”。

这可以做到吗?我看过的 MATLAB 中的大多数 3D 绘图函数要么将向量 Z 绘制为将 X 向量和 Y 向量作为输入的函数的“高度”,要么绘制所有 (u,v,w) 分量给定点 (x,y,z) 的场作为箭头,场强表示为箭头的长度。

提前致谢!

0 投票
0 回答
29 浏览

r - R中的数值错误

我需要比较数字。但是在一些比较中存在许多数值错误。我知道它们是错误的,因为分析结果是已知的。当然,当分析结果已知时,不需要数值评估,但我想知道如何以数值方式解决这些问题。示例如下所示...

0 投票
0 回答
221 浏览

numerical-computing - 如何计算数值稳定的 log(exp(x)-exp(y))

我正在尝试计算 log(exp(x)-exp(y)); 因为这不再是 sum,所以我不能使用 LogSumExp,如果 exp(x) 或 exp(y) 很大(例如 exp(32) 或其他东西),事情仍然会变得非常难看。

如何更安全地执行此操作?