计算科学

科学家使用计算机解决科学问题的问答

4
如何可靠地添加大指数项而不会出现溢出错误?
蒙特卡洛马尔可夫链中一个非常普遍的问题涉及计算概率,这些概率是大指数项的和, ea1+ea2+...ea1+ea2+... e^{a_1} + e^{a_2} + ... 其中的各组分可以从非常小的范围内,以非常大的。我的方法是排除最大指数项以便:aaaK:=maxi(ai)K:=maxi(ai)K := \max_{i}(a_{i}) a′=K+log(ea1−K+ea2−K+...)a′=K+log(ea1−K+ea2−K+...)a' =K + log\left( e^{a_1 - K} + e^{a_2 - K } + ... \right) ea′≡ea1+ea2+...ea′≡ea1+ea2+...e^{a'} \equiv e^{a_1} + e^{a_2} + ... 这种做法是合理的,如果所有的元素aaa,如果他们不是很大,但不是一个好主意。当然,较小的元素无论如何都不会对浮点数求和,但是我不确定如何可靠地处理它们。在R代码中,我的方法如下所示: if ( max(abs(a)) > max(a) ) K <- min(a) else K <- max(a) ans <- log(sum(exp(a-K))) + …

4
在计算科学中什么时候应该使用C ++表达式模板,什么时候不应该使用它们?
假设我正在使用C ++编写科学代码。在最近与一位同事的讨论中,有人争辩说表达模板可能是一件很糟糕的事情,有可能使软件只能在某些版本的gcc上编译。据推测,这个问题影响了一些科学规范,正如《堕落》这个模仿中的字幕所提到的那样。(这些是我所知道的唯一示例,因此是链接。) 但是,其他人则认为,表达模板很有用,因为它们可以避免将中间结果存储在临时变量中,从而可以提高性能(如SIAM Journal of Scientific Computing的论文)。 我对C ++中的模板元编程一无所知,但我知道这是自动微分和区间算术中使用的一种方法,这就是我讨论表达式模板的方式。考虑到性能方面的潜在优势和维护方面的潜在劣势(即使这是正确的话),我什么时候应该在计算科学中使用C ++表达式模板,什么时候应该避免使用它们?

5
PETSc和Trilinos之间的主要区别是什么?
据我所知,美国能源部的两个大型通用计算科学软件框架是 PETSc和Trilinos。乍一看,它们看起来很相似,只是语言上的差异(C与C ++)不同。这两个框架之间的主要区别是什么?应该选择哪些因素来影响一个因素?(忽略机构偏见和现有基础结构。)

8
哪种软件适合用于并行调试?
我现在不运行任何并行代码,但是我希望将来使用OpenMP和MPI的混合运行并行代码。对于我来说,运行串行项目时,调试器是非常宝贵的工具。 谁能推荐并行调试器(或多个调试器)用于调试并行软件?自由软件将是更可取的选择,但请毫不犹豫地提及有效的商业软件。

5
为什么等距点的表现不好?
实验说明: 在拉格朗日插值中,精确的方程在NNN个点(多项式N−1N−1N - 1)处采样,并在101个点处插值。这里从2变化到64。每个时间,和制备误差图。可以看出,当在等距点对函数进行采样时,误差开始下降(直到小于约15时才会发生),然后误差随着进一步增加而上升。NNNL1L1L_1L2L2L_2L∞L∞L_\inftyNNNNNN 而如果初始采样是在Legendre-Gauss(LG)点(Legendre多项式的根)或Legendre-Gauss-Lobatto(LGL)点(Lobatto多项式的根)进行的,则误差降至机器级别,并且不会当进一步增加时增加。NNN 我的问题是 等距点到底会发生什么? 为什么多项式阶数增加会导致误差在某个点之后上升? 这是否还意味着如果我将等距点用于WENO / ENO重建(使用拉格朗日多项式),那么在平滑区域中,我会得到错误?(嗯,这些只是假设的问题(以我的理解),对于WENO方案,重建15或更高阶数的多项式确实是不合理的) 额外细节: 功能近似: X∈[-1,1]f(x)=cos(π2 x)f(x)=cos⁡(π2 x)f(x) = \cos(\frac{\pi}{2}~x),x∈[−1,1]x∈[−1,1]x \in [-1, 1] ñxxx分为等距点(以后称为LG)点。每次在101点插值该函数。NNN 结果: a)等距点(插值): N=65N=65N = 65 b)等距点(误差图,对数刻度): a)LG点(插值): N=65N=65N = 65 b)LG点(误差图,对数刻度):

3
求解方程组线性系统的Krylov子空间方法收敛的原理是什么?
据我了解,解决线性方程组的方法有两大类: 固定方法(Jacobi,Gauss-Seidel,SOR,Multigrid) Krylov子空间方法(共轭梯度,GMRES等) 我了解到,大多数固定方法都是通过迭代地放松(平滑)错误的傅立叶模式而起作用的。据我了解,共轭梯度法(Krylov子空间法)通过“逐步”遍历来自应用于第ñnn个残差的矩阵的幂的最佳搜索方向集而工作。这个原理对所有Krylov子空间方法都通用吗?如果不是,那么,一般来说,我们如何表征Krylov子空间方法收敛的原理?

5
为了使我的计算研究具有可重复性,我应该在期刊文章中(或在线发布)包括哪些材料?
可重复性在计算科学研究中变得越来越重要。(例如,请参见《科学》杂志的Roger Peng的这篇文章;我也知道其他此类文章和网站。)但是,我不清楚我应该在期刊文章(或在线文章)中包含多少信息来制作我的计算研究具有可重复性(假设没有其他障碍,例如知识产权协议)。是否有任何指南,如果没有,人们是否可以建议研究人员应采取哪些步骤来使他们的计算科学研究可重复? 答案中特别有用的是实现这些建议的可能方法-从根本上说,工作流。最好是与系统无关或基于Linux的工作流。此外,讨论您所经历的任何相关个人经历也将有所帮助。 在我的特殊情况下,我正在写一篇理论论文,其中包含一些示例计算,这些计算很简单,可以在MATLAB中完成。我认为,在这种情况下,包括MATLAB脚本,并注意计算机上特定版本的MATLAB,足以确保可重复性。但是,我敢肯定还有更复杂的场景,有关如何进行可重复研究的建议对于将来的项目很有帮助。



1
是否有找到渐近斜率的数值算法?
我有一系列数据点,我希望(近似)遵循函数渐近到大的行。本质上,随着趋于零,并且对所有导数,都可以说相同等等。但是,我什至不知道f(x)的函数形式是什么,即使它甚至具有可以用基本函数来描述的形式。ý (X )X ˚F (X )≡ Ý (X )- (一X + b )X →交通∞ ˚F '(X )˚F “(X )˚F (X )(x一世,ÿ一世)(xi,yi)(x_i,y_i)ÿ(x )y(x)y(x)XxxF(X )≡ ÿ(x )− (a x + b )f(x)≡y(x)−(ax+b)f(x) \equiv y(x) - (ax + b)x → ∞x→∞x \to \inftyF′(x )f′(x)f'(x)F′(x )f″(x)f''(x)F(x )f(x)f(x) 我的目标是对渐近斜率a进行最佳估计一种aa。一种明显的粗略方法是挑选出最后几个数据点并进行线性回归,但是,如果F(x )f(x)f(x)在我拥有数据的x范围内没有变得“足够平坦”,那么这当然是不准确的Xxx。明显的粗略方法是假设F(X )≈ EXP(- X )f(x)≈exp⁡(−x)f(x) \approx …
23 algorithms 

5
什么时候在云中构建集群比在我的实验室中为MD模拟构建集群便宜?
关于亚马逊EC2的计算集群费用$ 800- $ 1000(取决于占空比)每个物理CPU内核,在3年的时间。在我们的最后一轮硬件收购中,我的实验室以大约300美元的价格购买了与亚马逊集群非常相似的48个内核的硬件。 我在这里想念什么吗?在任何情况下,在云中为高CPU任务(例如分子动力学模拟)构建集群都具有经济意义吗?还是我总是最好自己建造和保姆当当机呢? (我应该提到,我的实验室不支付服务器机房的电费(至少不直接支付),但是即使有了这种好处,亚马逊似乎仍然非常昂贵)。

12
是否可以使用Octave学习MATLAB编程?
此问题是从“交叉验证” 迁移而来的,因为可以在“计算科学堆栈交换”上回答。 迁移 7年前。 我想学习MATLAB编程,这样我就可以自己进行一些研究/分析,也可以研究/修改一些我在网上找到的MATLAB脚本。 但是,问题是我买不起MATLAB。据我所知,GNU Octave与MATLAB兼容。但是,Octave面临的挑战是文档非常稀疏。 因此,一方面,MATLAB过于昂贵(-ve),但在线上却有很多不错的文档,教程和脚本(+),而Octave是免费的(例如在啤酒中),尽管(可以理解)它缺少全面的文档,等等。 。 我正在考虑下载和安装Octave,但要使用MATLAB文档(和脚本)来帮助我开始。我知道Octave和MATLAB之间存在一些差异-我想弄清楚的是,差异是否足够大以阻止我的努力(有效)“使用Octave学习MATLAB”。 欢迎任何建设性的反馈。


5
在教计算机编程本科课程时,我应该使用哪种语言?
打算教本科生一门名为“计算机编程入门”的课程。我有点困惑。在计算物理学中,科学家使用C / C ++或Python或Fortran,CUDA等。...现在是时候建立自己的基础了。我应该使用什么?我知道您可以在自己的生活中随时学习新的编程语言,但是对我来说,以后再详细介绍所有基本编程概念和OOP概念是一个明智的选择。

10
哪种算法更准确地计算数字排序数组的总和?
给定正数的递增有限序列。以下两种算法中的哪一种更适合计算数字总和?ž1个,ž2,。。。。。žñz1,z2,.....znz_{1} ,z_{2},.....z_{n} s=0; for \ i=1:n s=s + z_{i} ; end 要么: s=0; for \ i=1:n s=s + z_{n-i+1} ; end 在我看来,最好将数字从最大到最小相加,因为误差会越来越小。我们也知道,当我们将一个非常大的数字加到一个非常小的数字上时,近似结果可能就是这个大数字。 它是否正确?还有什么可以说的?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.