问题标签 [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 投票
1 回答
52 浏览

matlab - Why in MATLAB is realmax minus something still equal to realmax?

In MATLAB, if I do realmax - 1000000 == realmax I get a logical 1 (true) as an answer. Why is that?

0 投票
1 回答
71 浏览

matlab - MATLAB 类效率

我试着让它变短。我遇到了一个问题,涉及对带有气体管道的流动进行数值模拟。我使用不同的模型来模拟从一个边界到另一个边界(即从右到左)的气流(传输方程)。问题是,因为我使用不同的模型来表示所述气体流量和边界条件,所以我得到了很多函数,例如:

我通过(例如)在数值方案之前分配所需的功能:

接下来是这样的:

你明白了。

现在,构建程序的最有效方式(在结构化时)是什么?据我所知,我有三个选择:

1)我在一个matlab函数文件中定义了每个函数(会产生很多文件)

2)我在脚本中为数值方案定义了每个函数(将导致长文件,调整/读取不太清楚)

3)我为边界条件创建了一个类,其中包含所有模型的方法,一个包含相应函数的通量和源类。在我的数值方案的函数分配中,我然后调用我需要的方法。(似乎复杂且低效,不确定在matlab中调用方法所需的时间,但对我来说是最结构化的方式)

我可能应该注意到,我对 matlab 和数值模拟(学生)相对较新,而且我也在问这种问题通常是如何解决的。提前致谢!另外作为奖励:如果有人喜欢使用 matlab 对 PDE 系统进行实际模拟——我会遇到诸如“我如何决定数值方案——我应该考虑哪些标准?”之类的问题。

再次感谢,祝大家有个愉快的一天!

0 投票
0 回答
29 浏览

c++ - C++ 链接器命令失败

我正在尝试执行以下命令。但是,我遇到了以下错误。

所有变量都在一个单独的文件中定义,所以看起来没问题。以上是命令行显示的完整错误。我已包含完整的错误以供参考。

0 投票
0 回答
153 浏览

matlab - 检查减法取消(浮点精度)

在阅读数值方法时,减法取消通常是一个主题。

取消的简单示例:

因此我们丢失了 b 的所有信息。

但是,我很少阅读有关如何检查此问题的信息。难道我们不能使用一个简单的函数来减去数字,这也警告我们有问题吗?例子:

这个简单的功能可能存在一些缺陷——这只是我的第一个想法。无论如何,这样的事情会起作用吗?为什么没有完成?(即我以前从未见过/听说过此类检查)。

0 投票
1 回答
464 浏览

numerical-methods - 修改割线法Javascript算法?

我需要你的帮助将这个新割线方法编码成 Javascript。

割线法使用两个起始参数,而这种新方法只需要一个起始参数。

先感谢您。


感谢您的回答[编辑:评论],这是我尝试过的,但它不起作用:

0 投票
1 回答
79 浏览

python - 向量化结果/迭代模拟(在 python 中)

这是一个非常普遍的问题——有没有办法向量化结果模拟(下一步取决于前面的步骤),或者任何这样的迭代算法?

显然,如果需要运行 M 次模拟(每 N 步),您可以for i in range(N)在每一步中使用并计算 M 值以获得显着的加速。但是假设您只需要一个或两个具有很多步骤的模拟,或者您的模拟没有固定数量的步骤(如辐射检测),或者您正在求解一个微分系统(同样,对于很多步骤)。有什么方法可以将上部 for 循环推到numpy引擎盖下(速度增益,我不是在谈论将 python 函数对象传递给numpy.vectorize),或者 cython-ish 方法是唯一的选择?或者也许这在 R 或一些类似的语言中是可能的,但在 Python 中不是(目前?)?

0 投票
1 回答
3468 浏览

python - numpy dtype=int

在下面的代码中。我得到了 x1 的预期结果

但是在下面的代码中,当我设置 dtype=int 为什么 x2 的结果不是[ 0 1 2 2 3 4 5 6 6 7 8 9 10],而是我得到 x2 的值时[ 0 1 2 3 4 5 6 7 8 9 10 11 12],最后一个值 12 超过了 10.4 的最终值。请澄清我的概念。

0 投票
3 回答
354 浏览

c - 通过使用 16 位算术计算级数来计算 π 时避免溢出?

我正在尝试编写一个程序,将 π 的十进制数字计算为 1000 位或更多位。

为了有趣地练习低级编程,最终程序将用汇编编写,在没有乘法或除法的 8 位 CPU 上,只执行 16 位加法。为了简化实现,希望能够仅使用 16 位无符号整数运算,并使用迭代算法。速度不是主要问题。而快速乘法和除法超出了这个问题的范围,所以也不要考虑这些问题。

在汇编中实现它之前,我仍然试图在我的台式计算机上找出一个可用的 C 算法。到目前为止,我发现以下系列相当有效且相对容易实现。

该公式是使用收敛加速技术从莱布尼茨系列推导出来的,要推导它,请参阅 Carl D. Offner 的 Computing the Digits in π ( https://cs.umb.edu/~offner/files/pi.pdf ) ,第 19-26 页。最终公式见第26页。我写的初始公式有一些拼写错误,请刷新页面查看固定公式。最大项的常​​数项2在第 54 页中进行了解释。该论文还描述了一种高级迭代算法,但我在这里没有使用它。

计算 π 的系列(固定错字)

如果使用许多(例如 5000)项评估该系列,则可以轻松获得数千位 π,并且我发现该系列也很容易使用此算法进行迭代评估:

算法

  1. 首先,重新排列公式以从数组中获取其常数项。

重新排列的公式(修复了另一个错字)

  1. 用 2 填充数组以开始第一次迭代,因此新公式类似于原始公式。

  2. carry = 0.

  3. 从最大的术语开始。从数组中获取一项 (2),将该项乘以PRECISION对 执行定点除法2 * i + 1,并将提醒作为新项保存到数组中。然后添加下一个术语。现在递减i,进入下一个学期,重复直到i == 1。最后加上最后一个词x_0

  4. 因为使用了 16 位整数,PRECISION所以10得到 2 个十进制数字,但只有第一个数字有效。将第二个数字保存为进位。显示第一个数字加进位。

  5. x_0是整数 2,不应该为连续迭代添加,清除它。

  6. 转到第 4 步以计算下一个十进制数字,直到我们拥有所需的所有数字。

实施1

将此算法转换为 C:

该代码可以将 π 计算为 31 位十进制数字,直到出错。

有时digit + carry大于 9,因此需要额外的进位。如果我们运气不好,甚至可能出现双进位、三进位等。我们使用环形缓冲区来存储最后 4 位数字。如果检测到一个额外的进位,我们输出一个退格来擦除前一个数字,执行一个进位,然后重新打印它们。这只是概念证明的一个丑陋的解决方案,这与我关于溢出的问题无关,但为了完整起见,这就是它。将来会实施更好的东西。

重复进位的实现 2

太好了,现在程序可以正确计算 534 位 π,直到出错。

16 位整数溢出

事实证明,在开始计算最大项的过程中,误差项变得非常大,因为开始的除数在 ~4000 的范围内。在评估级数时,numerator实际上立即开始在乘法中溢出。

整数溢出在计算前 500 位时是微不足道的,但开始变得越来越糟,直到给出不正确的结果。

更改uint16_t numerator = 0uint32_t numerator = 0可以解决这个问题并将 π 计算到 1000+ 位。

但是,正如我之前提到的,我的目标平台是 8 位 CPU,并且只有 16 位操作。是否有一个技巧可以解决我在这里看到的 16 位整数溢出问题,只使用一个或多个 uint16_t?如果无法避免多精度算术,那么在这里实现它的最简单方法是什么?我知道我需要引入一个额外的 16 位“扩展字”,但我不确定如何实现它。

并提前感谢您耐心地理解这里的长篇大论。

0 投票
0 回答
1523 浏览

matlab - 两相单纯形法与matlab

我的 MATLAB 代码存在问题,该代码使用两相单纯形法求解线性方程组。在某些示例中,它不起作用,我找不到问题所在。

工作示例和不工作示例如下图所示:

在此处输入图像描述


代码如下

如果您尝试解决这些问题,您会看到代码没有答案,我想知道为了工作而必须更改的内容。

0 投票
1 回答
275 浏览

python - 计算 3-D 卷曲的最快算法

我正在尝试编写一段代码,以数字方式计算矢量场的卷曲到具有周期性边界条件的二阶。但是,我制作的算法非常慢,我想知道是否有人知道任何替代算法。

提供更具体的上下文:我使用 3xAxBxC numpy 数组作为我的向量场,其中第一个轴指的是笛卡尔方向 (x,y,z),A,B,C 指的是该笛卡尔方向上的箱数(即决议)。例如,我可能有一个向量场 F = np.zeros((3,64,64,64)) 其中 Fx = F[0] 本身就是一个 64x64x64 笛卡尔格子。到目前为止,我的解决方案是使用 3 点居中差异模板来计算导数,并使用嵌套循环使用模算术迭代所有不同的维度以强制执行周期性边界条件(例如,请参见下文)。但是,随着我的分辨率增加(A、B、C 的大小),这开始需要很长时间(最多 2 分钟,如果我为我的模拟做了几百次,这会加起来——这只是更大算法的一小部分)。我想知道是否有人知道这样做的替代方法?

只是为了重新迭代,我正在寻找一种算法,该算法将比我拥有的周期性边界条件更快地计算向量场数组的卷曲到二阶。也许没有什么可以做到这一点,但我只是想在我继续花时间运行这个算法之前检查一下。感谢。大家提前!