计算科学

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

2
如何确定PDE的数值解是否收敛于连续解?
在松懈的等价性定理指出,一致性和数值方案的稳定性用于线性初值问题是收敛的必要和充分条件。但是对于非线性问题,尽管数值方法是一致且稳定的,但数值方法可以非常合理地收敛到错误的结果。例如,本文显示了应用于一维线性化浅水方程的一阶Godunov方法如何收敛到一个不正确的解。 显然,在网格和时间步长细化下的自收敛是不够的,但是对于非线性PDE来说,精确解通常是不可用的,那么如何确定一种数值方法是否收敛到一个真解?

6
如何编写尺寸无关的代码?
我经常发现自己为给定操作/算法的一维,二维和三维版本编写了非常相似的代码。维护所有这些版本可能会变得乏味。简单的代码生成效果很好,但是似乎认为必须有更好的方法。 有没有一种相对简单的方法可以一次编写一个操作并将其推广到更高或更低的维度? 一个具体的例子是:假设我需要计算频谱空间中速度场的梯度。在三个方面,Fortran循环看起来像: do k = 1, n do j = 1, n do i = 1, n phi(i,j,k) = ddx(i)*u(i,j,k) + ddx(j)*v(i,j,k) + ddx(k)*w(i,j,k) end do end do end do 其中ddx阵列被适当地限定。(也可以使用矩阵乘法来执行此操作。)二维流的代码几乎完全相同,除了:第三维从循环,索引和组件数中删除。有没有更好的表达方式? 另一个例子是:假设我在三维网格上逐点定义了流体速度。为了将速度插值到任意位置(即不对应于网格点),可以在所有三个维度上连续使用一维Neville算法(即降维)。给定简单算法的一维实现,是否存在一种简单的方法来进行降维?

4
Fortuna或Mersenne Twister是否更适合作为算法RNG?
最近的回答提到使用Fortuna或Mersenne Twister随机数生成器(RNG)进行蒙特卡洛模拟。我之前没有听说过Fortuna,所以我查了一下-看起来它主要是供加密使用的。 我目前在生产代码中使用Mersenne Twister播种K-Means算法。 哪种(Fortuna或Mersenne Twister)被认为是“算法播种”应用程序的最佳选择(例如Monte Carlo和K-Means播种)?还是“扔掉”-即使用最方便。 在我所坐的地方,“最佳”应该提供最高质量的随机数,可以快速运行,并且(可能)占用的内存少。其中,质量对于我们大多数人来说可能是最重要的。

1
对称正定矩阵的对角线更新
AAA是一个 ×对称正定(SPD)稀疏矩阵。是一个稀疏对角矩阵。大( > 10000),并且的非零数通常为100〜1000 。G n nn×nn×nn \times nGGGnnnnnnGGG AAA已因式分解在乔列斯基形式。LDLTLDLTLDL^T 当变为时,如何有效地更新和?D A A + GLLLDDDAAAA+GA+GA+G

3
在寻找针对特定问题的良好预处理方法时,应使用哪些准则?
对于使用迭代方法求解大型线性系统,通常需要引入预处理,例如,求解,其中用于系统的左预处理。通常,与原始系统的解决方案相比,我们应该使并提供(更多)有效解决方案或减少计算资源(例如内存存储)的基础(即当。但是,我们应该使用什么准则来选择预处理器?从业者如何针对他们的特定问题呢?中号- 1(甲X = b )中号中号- 1 ≈ 甲- 1中号= 甲甲X = bAx=bAx=b中号− 1(A x = b )M−1(Ax=b)M^{-1}(Ax=b)中号MM中号− 1≈ 一− 1M−1≈A−1M^{-1}\approx A^{-1}中号= AM=AM=A

1
为什么将八进制用于多极空间分解?
在快速多极子方法(FMM)的大多数(全部)实现中,八叉树用于分解相关域。从理论上讲,八叉树提供了一个简单的体积边界,这对于证明FMM的O(n)运行时很有用。除了这个理论基础之外,使用Octree替代其他树或trie数据结构是否有好处? 使用八叉树确定交互列表可能会更容易,因为单元会知道其直接邻居。但是,使用像Dual Tree Traversal这样的更具动态性的树遍历,则不需要交互列表。 另一种可能是kd树。理论上的一个可能缺点是,施工需要昂贵的中值发现操作。但是,有些kd树的版本不需要在构建过程中求中值-尽管空间分区效率较低。在实现方面,kd树非常简单。 一个甚至更根本的选择可能是R树。 所以,我的问题是:什么使八进制成为FMM的最佳选择?
18 algorithms 

2
什么是伪时间步长?
在阅读有关PDE求解器的一些文献时,我遇到了今天的伪时间步长一词。这似乎是一个常用术语,但是我找不到合适的定义或介绍性文章。 因此:什么是伪时间步长,通常如何使用?

3
在GPU上解决无约束的非线性优化问题
我正在尝试解决GPU(CUDA)上的一些不受约束的非线性优化问题。 目标函数是一个平滑的非线性函数,其梯度在分析上相对便宜,因此我无需理会数值逼近。 我想通过大多数fp32数学运算来解决此问题(由于各种原因),那么哪种非线性优化方法对舍入误差更鲁棒,同时又具有良好的性能?(例如共轭梯度/准牛顿/信任区域),有人在GPU上尝试过BFGS并获得良好结果吗? 顺便说一句,如果需要的话,Hessian相对较小(通常小于64x64),但是我需要同时解决数千个此类小规模优化问题。

2
具有可分配和假定形状数组的F2Py
我想f2py与现代Fortran 一起使用。特别是,我试图使以下基本示例正常工作。这是我可以生成的最小的有用示例。 ! alloc_test.f90 subroutine f(x, z) implicit none ! Argument Declarations ! real*8, intent(in) :: x(:) real*8, intent(out) :: z(:) ! Variable Declarations ! real*8, allocatable :: y(:) integer :: n ! Variable Initializations ! n = size(x) allocate(y(n)) ! Statements ! y(:) = 1.0 z = x + …
18 python  fortran 

1
Logum中的灾难性取消
我正在尝试在相对精度较低的双精度浮点中实现以下功能: logsum(x,y)=log(exp(x)+exp(y))logsum(x,y)=log⁡(exp⁡(x)+exp⁡(y))\mathrm{logsum}(x,y) = \log(\exp(x) + \exp(y)) 这在统计应用程序中被广泛使用以添加在对数空间中表示的概率或概率密度。当然,或都很容易溢出或下溢,这很不好,因为日志空间最初是用来避免下溢的。这是典型的解决方案:exp(x)exp⁡(x)\exp(x)exp(y)exp⁡(y)\exp(y) logsum(x,y)=x+log1p(exp(y−x))logsum(x,y)=x+log1p(exp⁡(y−x))\mathrm{logsum}(x,y) = x + \mathrm{log1p}(\exp(y - x)) Cancellation from y−xy−xy-x does happen, but is mitigated by expexp\exp. Worse by far is when xxx and log1p(exp(y−x))log1p(exp⁡(y−x))\mathrm{log1p}(\exp(y - x)) are close. Here's a relative error plot: The plot is cut off at 10−1410−1410^{-14} to emphasize …

1
小波如何应用于PDE?
我想学习如何将小波方法应用于PDE,但是不幸的是,我不知道学习此主题的好资源。 看起来,小波的许多介绍都集中在插值理论上,例如,通过最好叠加几个小波来组合信号。有时会提到PDE的应用程序,而无需深入探讨该主题。对于那些看过WFT但又对该主题没有更多知识的人,我感兴趣的是很好的摘要文章。当然,如果您认为可以做到的话,那么很好的总结也很有趣。 我对获得通常会出现哪种问题的印象特别感兴趣。例如,我知道有限元通常应用于具有Lipschitz边界的有界域上的PDE,这是选择ansatz空间(合格,不合格,几何和组合),收敛理论如何建立的典型问题(实际上,小波的Galerkin理论应该没有太大的不同),而且我有一些直觉,认为数学上的东西在实现中是可行的。对PDE的Wavelet这样的鸟瞰图对我很有帮助。
18 pde  wavelet 

4
是否有用于结构化网格自适应网格细化的通用库?
想要改善这篇文章吗?提供此问题的详细答案,包括引文和答案正确的解释。答案不够详细的答案可能会被编辑或删除。 自适应网格细化(AMR)是解决PDE数值解中空间尺度变化很大的常见技术。在结构化网格上存在哪些针对AMR的通用库?理想情况下,我希望本着PETSc的精神,库仅处理自适应网格,而我提供物理和离散化(有限差分/体积/元素)。 理想的图书馆是 模块化:不决定如何编写代码或过多的数据结构 General:不在乎我使用的是哪种离散化 高效:不会产生太多开销 并行且高度可扩展 仅适合这些条件中的一个子集的库仍将受到关注。 附录:我知道Donna Calhoun的AMR软件包的详细列表,但是我不知道其中哪个(如果有)符合上述条件。因此,我主要感兴趣的是听取具有一个或多个(或更多)软件包的实际经验的人,以了解他们如何衡量这些术语。

5
并行科学计算软件开发语言?
我想从头开始开发并行科学计算软件。我想开始使用哪种语言。该程序涉及将数据读/写到txt文件中,并并行进行大量计算,并具有许多LU分解和使用稀疏线性求解器的功能。我在考虑的候选解决方案是带有OpenMP或协同阵列的Fortran 2003/2008,带有openmp cilk +或TBB的C ++,python。任何其他有文件记录的建议,我们都欢迎!我非常了解C,Fortran和Java(按此顺序)。我已经在python中完成了一些脚本编写工作,但是基本的东西。 我知道fortran很快,但是很难维护和并行化。据说C ++运行缓慢,除非您使用外部库等我喜欢的Python,但是在其上编写全面的工业级软件是否现实? 该软件需要能够处理大量数据并通过科学计算有效。性能至关重要。 对于背景,我已经有一个用Fortran编写的工作软件。许多人参与了很多年的开发,并且代码真的很脏。维护和并行化代码被证明是一场噩梦,我正在考虑其他选择。 佩特罗斯



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.