计算科学

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

3
计算精度高的振荡系列?
假设我有以下有趣的函数: 它具有一些令人不愉快的特性,例如其导数在有理倍数下不是连续的。我怀疑不存在封闭表格。πF(x )= ∑ķ ≥ 1cosķ Xķ2(2 - cosk x )。f(x)=∑k≥1cos⁡kxk2(2−cos⁡kx). f(x) = \sum_{k\geq1} \frac{\cos k x}{k^2(2-\cos kx)}. ππ\pi 我可以通过计算部分和并使用Richardson外推法对其进行计算,但是问题是,将函数计算为足够的十进制数字太慢(例如100会很好)。 有没有一种方法可以更好地处理此功能? 这是带有一些伪像的:f′(πx)f′(πx)f'(\pi x)

4
对与使用MPI的代码/库兼容的单元测试框架有何建议?
通常,我编写串行代码,然后编写,并使用一些xUnit风格的测试框架(MATLAB xUnit,PyUnit / nose或Google的C ++测试框架)编写单元测试。 基于对Google的粗略搜索,关于从业人员如何对使用MPI的测试代码进行单元化的知识很少。有什么最佳实践吗? 与单元测试和测试驱动的开发策略相比,我正在寻找与应该用于测试框架的软件有关的答案(如果存在的话,答案很可能是“编写自己的代码”),其中自定义测试代码的案例示例会很有帮助)。 我要测试的大部分内容都是用于右侧步进功能的评估以及用于时间步进器的Jacobian矩阵汇编例程,这些例程将集成半离散的PDE。我将使用PETSc,因此,如果有PETSc特定的内容,那么除了更通用的测试框架之外,这也将有所帮助。 澄清度编辑: 一个示例将在中${PETSC_DIR}/src/ts/examples/tutorials/ex2.c,在该示例中,我想测试类似的内容RHSFunction(右侧函数评估),然后RHSJacobian(雅可比矩阵评估)。我将针对组装好的右侧和组装好的Jacobian矩阵的已知值进行测试;对于一些简单的问题实例,我可以通过分析获得这些值。这些函数是特定于应用程序的函数,不会执行任何其他应用程序级函数,但是如果在函数内完成矢量或矩阵汇编,则可以调用MPI(如上面的链接PETSc示例中所示)。如果我编写的函数仅计算处理器局部的矢量或矩阵的部分,则我将尽可能对全局汇编版本进行测试,因为对于并行编程来说,这是我的第一次直观思考全局矢量和全局矩阵。这些测试将在较小的问题规模和少量的处理器上运行。 我可以想到一些实现此目的的策略: 根据我在该主题上所做的Google搜索,一种可能效果不佳的策略是构造一个已知的输出,并行找到相对/绝对误差,然后进行幼稚的比较。输出可能会出现乱码 -任何使用MPI编写“ Hello,world”程序的人都知道原因-这限制了进行单元测试的效用。(这是提出问题的动力。)在调用单元测试框架时,似乎还存在一些潜在的棘手问题。 写输出到文件(PETSc中,例如,使用VecView和MatView),和比较反对的东西,如已知的输出ndiff或numdiff。我从以前通过文件比较进行单元测试的经验中得到的这种方法的直觉是,它会很挑剔,并且需要进行一些过滤。但是,此方法似乎非常适合进行回归测试,因为我可以将上述实用程序替换为plain diff,而不必担心匹配文本格式。我已经收集到该策略或多或少是WolfgangBangerth和Andybauer所建议的。PETSc似乎也使用类似的方法进行某些测试。 使用单元测试框架,将所有信息收集到MPI等级为0的处理器上,并仅在处理器等级为0时要求它执行单元测试。我可以对规范做类似的事情(这种方式可能更容易),尽管需要权衡取舍就是返回的任何错误都会告诉我我的计算有问题,但是哪些元素没有错误。然后,我不必担心任何单元测试输出都会出现乱码。我只需要担心正确调用单元测试框架。当确切的解决方案可用时,PETSc似乎在其示例程序中使用基于规范的比较,但进行比较时,它不使用单元测试框架(也不必这样做)。

5
计算
函数具有靠近奇点X = 0。但是,可以提高奇点:对于x = 1,应该使f (x )= 1,因为 e x = ∑ k = 0 x kf:x↦(ex−1)/xf:x↦(ex−1)/xf \colon x \mapsto (e^x-1)/xx=0x=0x = 0x=1x=1x = 1f(x)=1f(x)=1f(x) = 1 因此 (ex−1)/x=∑k=1x k − 1ex=∑k=0xkk!ex=∑k=0xkk! e^x = \sum_{k=0} \frac{x^k}{k!} 然而,形式(ëX-1)/X不仅在没有定义X=0,它也是在该点附近的数值不稳定; 为了在数值上评估非常小的x的f(x),可以使用泰勒展开,即上述幂级数的截断。(ex−1)/x=∑k=1xk−1k!(ex−1)/x=∑k=1xk−1k! (e^x - 1)/x = \sum_{k=1} \frac{x^{k-1}}{k!} (ex−1)/x(ex−1)/x(e^x-1)/xx=0x=0x = 0f(x)f(x)f(x)xxx 问:函数是否有名称?换句话说,这是一个普遍的问题吗?fff 问:是否有人知道可以很好地处理这种情况的C / …
13 c++  c 



2
矩阵求逆的“辅助因子技术”是否有实际意义?
标题就是问题。该技术涉及使用“辅因子矩阵”或“辅助矩阵”,并为方矩阵逆矩阵的成分提供了明确的公式。对于大于的矩阵,手工操作并不容易3×33×33\times 3。对于一个n×nn×nn\times n矩阵,它需要计算矩阵本身的行列式和计算n2n2n^2决定因素(n−1)×(n−1)(n−1)×(n−1)(n-1)\times(n-1)矩阵。因此,我猜测它对应用程序没有太大用处。但我想确认。 我并不是在问技术证明矩阵定理的理论意义。

4
用于C ++数值应用程序的测试套件?
最近,我一直在推动我的小组在编写他们的代码时包括更多的测试。有几个主要的错误所花的时间比可能需要花费的时间长得多,因为我们没有适当的测试机制。 但是,我怀疑拥有适当的工具来自动化(或帮助简化)流程肯定会有用。另一方面,我不知道C ++测试套件的各种选项,以及如何在它们之间进行选择? 是否有寻找内容的指南?是否有专门针对数值应用的指南?
13 testing 

3
生成运动网格的基本原理是什么?
我对实现对流扩散问题的移动网格感兴趣。自适应运动网格方法提供了一个很好的示例,说明如何使用有限差分对一维Burger方程进行此操作。有人能够提供一个使用移动网格的有限差分法求解一维对流扩散方程的实例吗? 例如,以保守的形式,等式为 üŤ= (a (x )u + düX)Xut=(a(x)u+dux)x u_t = (a(x)u + du_x)_x 其中是速度(空间的函数)。初始条件u (0 ,x )可以指定(例如)从左向右(例如,沿着管道)流动的流动物种,其中初始条件具有急剧的梯度。一个(x )a(x)a(x)u (0 ,x )u(0,x)u(0,x) 如何解决运动网格的均分布问题(可能使用De Boor算法或其他方法)?我希望自己在Python中实现此功能,以便您的答案可以更好地转换为代码! 悬赏之前的旧问题 根据系统属性生成自适应网格的基本方法是什么?我应该使用通量来衡量梯度较大的地方吗? 因为我寻求一种迭代(时间扫描)解决方案。我想从旧网格插值到新网格很重要,通常的方法是什么? 我真的很想看到一个解决简单问题(例如对流方程)的实例。 有关该问题的细节的一些背景知识。我正在模拟一维耦合方程组, ∂ü∂Ť= 一个ü∂2ü∂X2+ bü∂ü∂X+ fü(x ,u ,v ,w )∂v∂Ť= 一个v∂2v∂X2+ bv∂v∂X+ fv(x ,u ,v ,w )∂w∂Ť= 一个ü∂ü∂X+ 一个v∂v∂X+ fw(x ,u ,v ,w )∂u∂t=au∂2u∂x2+bu∂u∂x+fu(x,u,v,w)∂v∂t=av∂2v∂x2+bv∂v∂x+fv(x,u,v,w)∂w∂t=au∂u∂x+av∂v∂x+fw(x,u,v,w) …

2
关于Armijo规则的困惑
我对行搜索中使用的Armijo规则感到困惑。我正在阅读回溯追踪线搜索,但没有得到Armijo规则的全部内容。谁能详细说明Armijo规则是什么?维基百科似乎解释得不好。谢谢

3
关于压缩感测问题的困惑
我阅读了一些参考资料,包括this。 我对压缩感测建立和试图解决的优化问题感到困惑。是吗 minimizesubject to∥x∥1Ax=bminimize‖x‖1subject toAx=b\begin{array}{ll} \text{minimize} & \|x\|_1\\ \text{subject to} & Ax=b\end{array} 或/和 minimizesubject to∥x∥0Ax=bminimize‖x‖0subject toAx=b\begin{array}{ll} \text{minimize} & \|x\|_0\\ \text{subject to} & Ax=b\end{array} 或/还有其他?

1
复杂对称三对角广义特征值问题的专用方法
我必须解决广义特征值问题其中和都是三对角线的,是对称正定的且是实数的,但是仅是复对称的(不是定对称的或埃尔米特的)。此外,我需要完整的特征分解。我目前只是在打电话给Lapack的广义特征求解器,但是我想知道对于这个特殊的,高度结构化的问题是否有更好的方法。特别是,拥有免费可用的代码(C ++)将是最好的。Ax=λBxAx=λBxAx = \lambda BxAAABBBBBBAAAZGGEV

5
有限元矩阵稀疏结构的计算
问题:有哪些方法可以准确有效地计算有限元矩阵的稀疏结构? 信息:我正在使用Poerson压力方程求解器,使用Galerkin方法和二次Lagrange基础(用C编写),并使用PETSc进行稀疏矩阵存储和KSP例程。为了有效地使用PETSc,我需要为全局刚度矩阵预先分配内存。 目前,我正在做一个模拟程序集,以估计每行非零的数量,如下所示(伪代码) int nnz[global_dim] for E=1 to NUM_ELTS for i=1 to 6 gi = global index of i if node gi is free for j=1 to 6 gj = global index of j if node gj is free nnz[i]++ 但是,这会高估nnz,因为某些节点之间的交互可能会在多个元素中发生。 我已经考虑过尝试跟踪发现的i,j交互,但是我不确定如何在不使用大量内存的情况下执行此操作。我还可以遍历节点,并找到以该节点为中心的基本功能的支持,但是随后我必须搜索每个节点的所有元素,这似乎效率很低。 我发现了这个最近的问题,其中包含一些有用的信息,特别是来自Stefano M的,他写了 我的建议是应用一些图论概念,以python或C语言实现它,即将矩阵中的元素视为图的边并计算邻接矩阵的稀疏结构。列表列表或键字典是常见的选择。 我正在寻找有关此的更多详细信息和资源。我承认我不太了解图论,而且我对所有可能有用的CS技巧都不熟悉(我从数学的角度出发)。 谢谢!

3
了解迭代方法的“收敛速度”
根据维基百科,收敛速度表示为矢量规范的特定比率。我试图了解在不同时间点(基本上是在迭代的“开始”和“结束”)“线性”速率和“二次”速率之间的差异。可以这样说: ek+1ek+1e_{k+1}xk+1xk+1x_{k+1}∥ek∥‖ek‖\|e_k\| 通过二次收敛,迭代的误差的范数以为边界ek+1ek+1e_{k+1}xk+1xk+1x_{k+1}∥ek∥2‖ek‖2\|e_k\|^2 这种解释将意味着,在线性收敛算法A1的迭代次数很少(假设为随机初始化)的情况下,与二次收敛算法A2的迭代次数很少相比,将实现较小的误差。但是,由于误差减小了,并且由于平方,所以以后进行迭代将意味着A2的误差较小。 以上解释有效吗?注意,它忽略了速率系数。λλ\lambda

3
使用带指针的派生类型数组时,fortran中的内存使用情况
在此示例程序中,我以两种不同的方式做同样的事情(至少我是这样认为的)。我在Linux PC上运行此程序,并通过top监视内存使用情况。使用gfortran,我发现第一种方式(“ 1”和“ 2”之间)使用的内存为8.2GB,而第二种方式(“ 2”和“ 3”之间)使用的内存为3.0GB。使用英特尔编译器,两者之间的差异更大:10GB与3GB。对于使用指针,这似乎是一个过度的惩罚。为什么会这样? program test implicit none type nodesType integer:: nnodes integer,dimension(:),pointer:: nodes end type nodesType type nodesType2 integer:: nnodes integer,dimension(4):: nodes end type nodesType2 type(nodesType),dimension(:),allocatable:: FaceList type(nodesType2),dimension(:),allocatable:: FaceList2 integer:: n,i n = 100000000 print *, '1' read(*,*) allocate(FaceList(n)) do i=1,n FaceList(i)%nnodes = 4 allocate(FaceList(i)%nodes(4)) FaceList(i)%nodes(1:4) = …

2
冯·诺伊曼稳定性分析的有限差分方法的替代方法
我正在研究耦合的一维多孔弹性方程(比奥模型),给出为: −(λ+2μ)∂2u∂x2+∂p∂x=0−(λ+2μ)∂2u∂x2+∂p∂x=0-(\lambda+ 2\mu) \frac{\partial^2 u}{\partial x^2} + \frac{\partial p}{\partial x} = 0 ∂∂t[γp+∂u∂x]−κη[∂2p∂x2]=q(x,t)∂∂t[γp+∂u∂x]−κη[∂2p∂x2]=q(x,t)\frac{\partial}{\partial t} \left[ \gamma p + \frac{\partial u}{\partial x}\right] -\frac{\kappa}{\eta}\left[\frac{\partial^2 p}{\partial x^2}\right] =q(x,t) 在域并具有边界条件: Ω=(0,1)Ω=(0,1)\Omega=(0,1) p=0,(λ+2μ)∂u∂x=−u0p=0,(λ+2μ)∂u∂x=−u0p=0, (\lambda + 2\mu)\frac{\partial u}{\partial x}=-u_0 at and在。ü = 0 ,∂ px=0x=0x=0X=1u=0,∂p∂x=0u=0,∂p∂x=0u=0, \frac{\partial p}{\partial x} = 0x=1x=1x=1 我使用中心有限差分方案离散了这些方程式: γp吨+ 1我 -p吨我(λ + 2 …

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.