计算科学

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

3
使用非常规编程语言进行科学计算
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 注意:以下文章可能包含有争议的观点,因此请注意,这些只是我的观点,并不旨在冒犯任何人。 从1999年左右开始,我就开始以某种形式进行编程。我最初使用R,后来在2004年左右使用,主要是改用Python。 例如,对于许多科学应用程序而言,仿真(包括MCMC等),R和Python都太慢,需要加快速度。这样做的通常方法是使用C或C ++进行扩展。对于R和Python,这就是我所做的,使用R的C API和C ++,以及Boost Python库和Python。 但是,由于各种原因,这种组合不是理想的解决方案。在编程中,特别是算法中,什么重要?表现力和速度当然是相关的。一门语言表现力越强,使用它就能写得越快。 1)就表达能力而言,我认为R和Python都不是编写科学算法的理想选择。它们没有紧密映射到基础算法。但是,它们都比C ++好得多。 2)我喜欢用Python编写,这是一种令人愉悦的语言,尽管如上所述,它并不是算法工作的理想选择。但是,当由于速度问题而不得不使用Python / C ++组合时,这种混合使用起来会变得不太愉快。通常会发生的事情是,我首先使用Python编写代码,一旦有了运行良好的东西,就常常发现它太慢了(因为某些主观值太慢了)。然后,我面临的决定是花一些不合理的时间用C ++重写它,还是忍受缓慢。事后看来,我常常会觉得自己最好还是忍受缓慢,特别是因为获得的加速是无法预测的。而且,两者之间的Boost Python接口是一个非常麻烦的维护工作,并用两种截然不同的语言将代码粘合在一起,这很让人分心。无需批评Boost Python,它就像一个人所能想到的一样强大的界面,并且几乎在大多数时候都可以使用。 现在,在一个拥有无限时间和资源的理想世界中,这些问题都不是什么大问题。但是,在我从事的科学项目中,我有以下经验。 无论我是否在该项目上有合作者,我似乎总是想尽一切办法进行计算。在总共5个重大项目中,我只有一个人的大量参与才能参与一个项目。一个人所做的不只是减轻体重;他做了我或更多的事情。但是,在所有其他情况下,包括具有多个合作者的项目,我已经(实际上)完成了所有计算工作。虽然我可以说我并没有受到最好的合作者的祝福(这似乎是懒惰和无能的结合),但我不清楚这种情况在将来是否有可能改变。 计算科学工作是一项巨大的工作,如果我不能改变合作者的行为方式,那么我可以改变工作方式。最重要的改进是更快地完成工作。这使我想到这里的主要考虑因素,那就是将语言切换到非正统的东西可能会有所帮助。根据过去的研究,按可能性顺序排列的最可能的候选对象是Common Lisp和Ocaml。我已经考虑了多年,但是最近一直在认真考虑。 据我所知,很少有人使用CL或Ocaml进行科学计算。在搜索此站点时,我发现有两个引用CL(一个是我的),另一个引用了Ocaml(我的)。多年来,我与那些在边缘工作的冒险人士保持了令人鼓舞的联系。2008年,我遇到了Tamas K. Papp对彼得·塞贝尔(Peter Seibel)的“ Practical Common Lisp”(我拥有)进行的书评。这引起了我的注意,因为这是我在网上遇到的为Lisp进行的科学计算中为数不多的提及之一。我写信给塔马斯(Tamas),他立即给予了帮助和鼓舞。引用他 使用Lisp,我的编程效率可能提高了十倍,但这花了大约一年的时间,而且我还在学习(尽管两个月后我的表现还不错)。因此,如果您的工作时间紧迫,请推迟切换。 您应该考虑问问有关cll的问题,我不是唯一知道这些事情的人,其他人也在Lisp上进行科学计算。 他还拥有一个博客和一个GitHub页面。 我曾与之短暂通信的另一个人(2006年12月)是Ira Kalet,他在放射肿瘤学领域使用了Common Lisp。 也许还有其他人在Lisp上进行科学计算,但我不认识任何人。 人们用CL引用的最常见问题是缺少库。这在通用计算中是一个严重的问题,但在科学计算中可能不是那么严重,特别是从根本上实现算法时。具体来说,我大部分时间都可以使用基本的数学库,包括概率分布函数,多维数组库以及C ++和Python标准库中的基本容器集,例如地图,集合,列表等。 我对Ocaml的了解甚至少于对CL的了解,但可以选择替代。它据说非常快,由法国研究人员免费实施,并且似乎是ML系列科学计算中最可行的。 最后,我想知道其他人是否对此有经验,他们有什么想法(如果有)。 编辑:在我上面讨论的问题的背景下,我对第一手经验最感兴趣。例如,如果您曾经使用Python和C ++(或R和C ++)并转而使用一种比较晦涩的语言,那么我最有兴趣了解您的经历。
22 languages 

2
有什么简单的方法可以自适应地采样2D函数?
我有一个二维函数,我想对它的值进行采样。该函数的计算非常昂贵,而且形状复杂,因此我需要找到一种方法,以最少的采样点获取有关其形状的最多信息。f(x,y)f(x,y)f(x,y) 有什么好的方法可以做到这一点? 到目前为止我有什么 我从已经计算了函数值的现有点集开始(这可以是点的方格或其他形式)。 然后,我计算这些点的Delaunay三角剖分。 如果在Delaunay三角两个相邻点足够远()和函数值不同充分地它们(> Δ ˚F),然后我插入一个新的中点其间它们。我为每个相邻的点对执行此操作。>ΔX>ΔX > \Delta X>Δf>Δf> \Delta f 这种方法有什么问题? 好吧,它工作得相对较好,但是在与此功能类似的功能上并不理想,因为采样点往往会“越过”山脊,甚至不会注意到那里。 它会产生如下结果(如果初始点网格的分辨率足够粗糙): 上图显示了计算函数值的点(实际上是它们周围的Voronoi单元)。 上图显示了从相同点生成的线性插值,并将其与Mathematica的内置采样方法(大约相同的起始分辨率)进行了比较。 如何改善呢? 我认为这里的主要问题是我的方法基于渐变来决定是否添加细化点。 添加细化点时最好考虑曲率或至少考虑二阶导数。 题 当我的点的位置完全不受约束时,考虑二阶导数或曲率的一种非常简单的实现方法是什么?(我不一定要有一个正方形的起点,理想情况下应该是通用的。) 还是有其他简单的方法可以以最佳方式计算精炼点的位置? 我将在Mathematica中实现这一点,但是这个问题主要与方法有关。对于“易于实现”这一点,确实可以认为我正在使用Mathematica(即到目前为止,这很容易完成,因为它具有用于执行Delaunay三角剖分的程序包) 我将其应用于什么实际问题 我正在计算一个相图。它具有复杂的形状。在一个区域中,其值为0,在另一个区域中,其值为0到1。两个区域之间有一个急剧的跳跃(不连续)。在函数大于零的区域中,既有一些平滑变化,也有一些不连续。 该函数值是根据蒙特卡洛模拟计算得出的,因此偶尔会出现不正确的函数值或噪声(这种情况很少见,但是对于很多点,它会发生,例如,当未达到稳态时,一些随机因素) 我已经在Mathematica.SE上问过这个问题,但由于它仍处于私测阶段,所以无法链接到它。这里的问题是关于方法,而不是实现。 回复@suki 您是否建议这种划分类型,即在三角形的中间放置一个新点? 我在这里担心的是,似乎需要对该区域的边缘进行特殊处理,否则它将产生非常长且非常细的三角形,如上所示。你纠正了吗? 更新 我描述的方法和@suki提出的基于三角形进行细分并将细分点置于三角形内的建议都出现了一个问题,即当存在不连续性时(如我的问题),在执行步骤之后可能会重新计算Delaunay三角剖分导致三角形发生变化,并且可能会出现一些大三角形,在三个顶点中它们具有不同的函数值。 这是两个示例: 第一个显示围绕直线不连续采样时的最终结果。第二个显示了类似情况下的采样点分布。 有什么简单的方法可以避免这种情况?目前,我只是在细分那些在重新三角化之后消失的egdes,但这感觉就像是破解,需要谨慎进行,因为在对称网格(例如方形网格)的情况下,存在多个有效的Delaunay三角剖分,因此边缘可能会改变重新三角化后随机。


4
正交变换何时能胜过高斯消除?
众所周知,线性方程组的正交变换方法(Givens旋转和Housholder反射)比高斯消元法昂贵,但从理论上讲,它们在不改变系统条件数的情况下具有更好的稳定性。尽管我只知道矩阵的一个学术示例,但由于部分旋转而被高斯消除所破坏。而且,人们普遍认为,在实践中很难实现这种行为(请参阅本讲义[pdf])。 那么,我们应该在哪里寻找有关该主题的答案?并行实现?正在更新?

2
连续性方程的良好有限差分
下面的等式将是一个很好的有限差分离散化: ∂ρ∂t+∇⋅(ρu)=0∂ρ∂t+∇⋅(ρu)=0\frac{\partial \rho}{\partial t} + \nabla \cdot \left(\rho u\right)=0? 我们可以考虑一维情况: ∂ρ∂t+ddx(ρu)=0∂ρ∂t+ddx(ρu)=0\frac{\partial \rho}{\partial t} + \frac{d}{dx}\left(\rho u\right)=0 由于某种原因,我可以找到的所有方案都是针对拉格朗日坐标的。我暂时想出了这个方案(不考虑j索引): ρn+1i,j−ρni,jτ+1hx(ρn+1i+1,j+ρn+1i,j2unxi+1/2,j−ρn+1i,j+ρn+1i−1,j2unxi−1/2)=0ρi,jn+1−ρi,jnτ+1hx(ρi+1,jn+1+ρi,jn+12uxi+1/2,jn−ρi,jn+1+ρi−1,jn+12uxi−1/2n)=0 \frac{\rho^{n+1}_{i,j}-\rho^{n}_{i,j}}{\tau} + \frac{1}{h_x}\left(\frac{\rho^{n+1}_{i+1,j}+\rho^{n+1}_{i,j}}{2}u^{n}_{_xi+1/2,j}- \frac{\rho^{n+1}_{i,j}+\rho^{n+1}_{i-1,j}}{2}u^{n}_{_xi-1/2}\right)=0 但是似乎真的不稳定或有一些可怕的稳定条件。是这样吗? 速度实际上是通过达西定律。另外,我们还有状态方程。整个系统还包括一个能量方程和理想气体的状态方程。速度可能变为负数。u=−kμ∇pu=−kμ∇pu=-\frac{k}{\mu}\nabla p

3
求解
我有矩阵AAA和GGG。AAA是稀疏的,并且是n×nn×nn\times n其中nnn非常大(可以达到几百万个数量级。)GGG是一个n×mn×mn\times m高的矩阵,其中mmm很小(1<m<10001<m<10001 \lt m \lt 1000),每列只能有一个111条目其余为的,以使得。很大,所以反转起来真的很困难,我可以求解一个线性系统,例如000GTG=IGTG=IG^TG = IAAAAx=bAx=bAx = b迭代地使用Krylov子空间方法,例如,但我没有明确地拥有。BiCGStab(l)BiCGStab(l)\mathrm{BiCGStab}(l)A−1A−1A^{-1} 我想解决以下形式的系统:,其中和是长度向量。一种实现方法是在迭代算法中使用迭代算法来为外部迭代算法的每次迭代求解。但是,这将在计算上极其昂贵。我想知道是否有一种计算上更简单的方法来解决这个问题。x b m A − 1(GTA−1G)x=b(GTA−1G)x=b(G^TA^{-1}G)x = bxxxbbbmmmA−1A−1A^{-1}

1
插补多维数据的首选和有效方法是什么?
插补多维数据的首选和有效方法是什么? 我担心的事情: 性能和构造记忆,单次/批处理评估 处理尺寸从1到6 线性或高阶 获得梯度的能力(如果不是线性的) 常规与分散网格 用作插值函数,例如查找根或最小化 外推能力 是否有有效的开源实现? 我对scipy.interpolate和来自scikit-learn的kriging感到幸运。 我没有尝试样条曲线,切比雪夫多项式等。 到目前为止,我在该主题上发现了以下内容: 矩形网格上的Python 4D线性插值 快速插值定期采样的3D数据(在x,y和z中具有不同的间隔) 快速插值常规网格数据 哪种多元分散插值方法最适合实际使用?

8
科学计算中的现代C ++?
我正在寻找书籍或文章,博客文章或任何已出版的一般材料,这些材料专门解决了科学计算中C ++现代功能(移动语义,STL,迭代器,惰性评估等)的使用。你能建议什么吗? 我认为这些新功能将使编写高效的代码更加容易,但是我还没有找到真正的例子。我阅读的大多数参考文献都是关于C ++的一般用法的,并不包含科学计算的示例。因此,我正在寻找使用C ++现代功能的科学计算代码的示例(不一定是生产代码示例,而仅是教学示例,例如在数字食谱方面)。 请注意,我并不是在问使用这些功能的库。我在询问有关文章/书籍/等的内容,以解释如何在科学计算中利用这些功能。

3
英特尔Fortran编译器:编译时的优化技巧
我将从我在实验室中的亲身经历开始。在ifort 9天和10天中,我们过去一直非常积极地进行优化,使用-O3和特定于处理器的标志(例如-xW -xSSE4.2)进行编译。但是从ifort 11开始,我们开始注意到: 1.结果中存在一些不一致之处(因为未保留语义) 2.与-O2相比,获得的收益较小。 因此,当前,我们通常仅使用-O2和-xhost进行编译。您是否对ifort 11有更好的建议?当我们过渡到ifort 12时,这种情况会再次改变吗?提前致谢。

1
Python / Numpy数组运算的性能如何随着数组尺寸的增加而缩放?
Python / Numpy数组如何随着数组尺寸的增加而缩放? 这是基于我在对这个问题进行Python代码基准测试时发现的一些行为:如何使用numpy slices表达这种复杂的表达式 问题主要涉及索引以填充数组。我发现在Python循环上使用(不太好)Cython和Numpy版本的优势因涉及的数组大小而异。Numpy和Cython都在一定程度上提高了性能优势(在我的笔记本电脑上,Cython 大约为,Numpy 大约为N = 2000),之后它们的优势下降了(Cython功能仍然是最快的)。N=500N=500N=500N=2000N=2000N=2000 是否定义了此硬件?在处理大型阵列方面,对于那些对性能表现满意的代码,应该遵循哪些最佳实践? 这个问题(为什么我的矩阵向量乘法缩放不为什么?)可能是相关的,但是我有兴趣了解更多有关Python处理数组的不同方式如何相对缩放的信息。

4
(自适应?)函数绘图的算法
我正在寻找算法来绘制可能具有或不具有奇异性的函数的标准2d图形。目的是编写一个“ Mini-CAS”,所以我对功能的类型没有先验知识,用户想画图。 这个问题很老,所以我想在文献中一定有一些标准算法。有一次,我没有太多通过谷歌找到参考文献的成功。 我确实找到了一种有趣的算法,即 “ YACAS-算法集”中的一种名为“自适应函数绘图” 的算法。 简而言之: 有标准算法吗? 是否有针对已知难以绘制功能的测试套件? 有哪些有趣的论文可供阅读?

2
解决稀疏线性系统的库
有许多不同的库可以解决稀疏的线性方程组,但是我发现很难找出区别。 据我所知,主要有三个软件包: Trilinos,PETSc和Intel MKL。它们都可以做稀疏矩阵求解,它们都很快(据我所知,我还不能在其中任何一个上找到可靠的基准),并且它们都是可并行化的。我找不到的是差异。 那么,那里的不同的稀疏线性系统求解器之间有什么区别呢?

5
如何在数值上区分不均匀采样的函数?
标准有限差分公式是可用的,以数值计算的期望你有函数值下一个衍生物在均匀间隔的点,让ħ ≡ X ķ + 1 - X ķ是常数。如果我的点间距不均匀怎么办,以使现在从一对相邻的点到另一对相邻的点变化?显然,我仍然可以将一阶导数计算为,但是存在高阶数值微分公式以及可以适应网格大小变化的精度?f(xk)f(xk)f(x_k)h≡xk+1−xkh≡xk+1−xkh \equiv x_{k+1} - x_khhhf′(x)≈1hk[f(xk+1)−f(xk)]f′(x)≈1hk[f(xk+1)−f(xk)]f'(x) \approx \frac{1}{h_k}[f(x_{k+1}) - f(x_k)]

8
用于约束优化的软件包?
我正在寻找解决约束优化问题的方法,在该方法中我知道某些变量(特别是盒装约束)的界限。 argminuf(u,x)arg⁡minuf(u,x) \arg \min_u f(u,x) 服从 c(u,x)=0c(u,x)=0 c(u,x) = 0 a≤d(u,x)≤ba≤d(u,x)≤b a \le d(u,x) \le b 其中uuu是设计变量的向量,xxx是状态变量的向量,c(u,x)c(u,x)c(u,x)是等式约束(通常是PDE)。上下约束aaa和bbb可以在空间上变化。 哪些软件包可以处理这种形式的系统?

3
预计算后能否在二次时间内求解对角线加固定对称线性系统?
是否存在方法来求解形式为线性系统,其中A为固定SPD矩阵,D_i为正对角矩阵?O(n3+n2k)O(n3+n2k)O(n^3+n^2 k)kkk(Di+A)xi=bi(Di+A)xi=bi(D_i + A) x_i = b_iAAADiDiD_i 例如,如果每个DiDiD_i是标量,则足以计算A的SVD AAA。但是,由于缺乏可交换性,因此对于一般D而言,这种情况会DDD恶化。 更新:到目前为止,答案为“否”。有谁对为什么有任何有趣的直觉?没有答案意味着没有非平凡的方法来压缩两个非交换运算符之间的信息。这并不出乎意料,但是更好地理解它会很棒。

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.