计算科学

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

8
在C中解析蛋白质结构数据
我的背景是基因组学,但是最近我一直在研究与蛋白质结构有关的问题。我用C语言编写了一些相关程序,在此过程中从头开始构建了自己的PDB文件解析器。我不担心制作一个真正强大的解析器,我只是知道自己构建一个将是迫使自己真正理解PDB格式的最佳方法。 现在,我已经完成了这个过程,我正在寻找更坚固和成熟的东西。是否在C中实现了任何开源蛋白质结构库?我可以在Google上找到一些,但我以前从未听说过,而且它们似乎还不太成熟或稳定。一个稍微相关的问题:是否每个人都真的使用Python进行所有这些类型的计算吗?或自制代码? PS。我本质上是在寻找一个包含PDB文件解析器,用于计算键角,键长,扭转角,表面可访问表面积等的函数的库。

1
尼采法在数值分析中的总体思路是什么?
我知道Nitsche方法是一种非常吸引人的方法,因为它允许在不使用Lagrange乘数的情况下考虑Dirichlet类型的边界条件或以较弱的方式与摩擦边界条件接触。它的优点是,将实现实现与模型相关,这是将Dirichlet边界条件类似于Neumann边界条件转换为弱项的优势。 但是,这对我来说似乎太笼统了。您能给我更具体的想法吗?一个简单的例子将不胜感激。

3


2
为何不反转矩阵的实际示例
我知道将矩阵求逆来求解线性系统不是一个好主意,因为它不如直接求解该系统或使用LU,Cholesky或QR分解那样准确和有效。 但是,我无法通过一个实际的例子进行验证。我已经尝试过此代码(在MATLAB中) M = 500; A = rand(M,M); A = real(expm(1i*(A+A.'))); b = rand(M,1); x1 = A\b; x2 = inv(A)*b; disp(norm(b-A*x1)) disp(norm(b-A*x2)) 并且残差总是相同的阶数(10 ^ -13)。 有人可以提供一个实际的例子,其中inv(A)* b的准确度远小于A \ b吗? ------问题更新------ 谢谢您的回答。但是,假设我们必须求解次系统,其中始终是相同的矩阵。考虑一下A x = b AnnnAx=bAx=bAx = bAAA -已满,因此需要存储器存储比相同。AAAA−1A−1A^{-1}AAA 条件数较小,因此可以精确计算。AAAA−1A−1A^{-1} 在那种情况下,计算比使用LU分解会更有效吗?例如,我已经尝试过以下Matlab代码:A−1A−1A^{-1} %Set A and b: M = 1000; A = rand(M,M); …

6
很难用多项式近似的连续函数的示例
出于教学目的,我需要单个变量的连续函数,该函数对于多项式近似是“困难的”,即一个幂级数需要非常高的幂才能很好地“拟合”该函数。我打算向我的学生展示幂级数可以达到的“极限”。 我曾想过炮制一些“嘈杂”的东西,但是我没有想自己动手做,而是想知道人们是否使用一种标准的“难函数”来测试逼近/插值算法,这与那些具有众多功能的优化测试函数有些相似天真算法容易卡住的局部最小值。 道歉,如果这个问题的格式不正确;请怜悯非数学家。

1
牛顿-克里洛夫什么时候不适合求解?
最近,我一直在比较来自scipy的不同非线性求解器,并且尤其对《 Scipy Cookbook》中的Newton-Krylov示例印象深刻,在该示例中,他们用大约20行代码来求解带有非线性反应项的二阶微分方程组。 我修改了示例代码,以解决半导体异质结构的非线性Poisson方程(也称为Poisson-Boltzmann方程,请参见本说明中的第17页),其形式为: d2ϕdx2−k(x)(p(x,ϕ)−n(x,ϕ)+N+(x))=0d2ϕdx2−k(x)(p(x,ϕ)−n(x,ϕ)+N+(x))=0 \frac{d^2\phi}{dx^2} - k(x) \left(p(x,\phi) - n(x,\phi) + N^{+}(x)\right) = 0 (这是传递给求解器的残差函数。) 这是一个静电问题,其中和是形式为n_i(x)e ^ {-(E_i(x,\ phi)-E_f)}的非线性函数。此处的细节并不重要,但关键是非线性函数随\ phi呈指数变化,因此残差函数可以在很大的范围内(10 ^ {-6}-10 ^ {16})发生微小变化。在\ phi中n(x,ϕ)n(x,ϕ)n(x,\phi)p(x,ϕ)p(x,ϕ)p(x,\phi)ni(x)e−(Ei(x,ϕ)−Ef)ni(x)e−(Ei(x,ϕ)−Ef)n_i(x) e^{-(E_i(x,\phi) - E_f)}ϕϕ\phi10−6−1016)10−6−1016)10^{-6} - 10^{16})ϕϕ\phi。 我用scipy的Newton-Krylov用数值方法求解了这个方程,但是它永远不会收敛(实际上,在计算雅可比方程时总是会报告一个错误)。我从Newton-Krylov求解器切换为fsolve(基于MINPACK hybrd),它第一次起作用! 牛顿-克里洛夫(Newton-Krylov)不适合某些问题的一般原因吗?输入方程是否需要以某种方式进行调节? 也许需要更多信息来发表评论,但是为什么您认为fsolve在这种情况下有效?

4
我应该租用计算资源还是购买自己的计算机
由于此问题与计算有关,因此我决定在此处发布。希望它将被认为是适当的。 我刚刚开始运行大气模型和海洋模型,并且意识到与当前的台式机相比,我需要更多的内核,内存和磁盘空间。我所在的机构拥有高性能的计算服务,研究人员可以按每月每个核心的固定价格租用核心。我的研究小组中没有人使用过这项服务,而是运行功能强大的机器来完成工作。但是,该部门中的其他几个研究小组会集中资金并利用计算服务。 现在,我需要决定是否购买具有60 GB RAM的新计算机,或者从计算服务中租用内核。在做出此决定时应考虑哪些因素?使用计算服务比购买专用计算机有什么优势?
16 hpc 

3
单元测试和测试驱动开发的策略
我是科学计算中测试驱动开发的坚定拥护者。实际上,它的实用性令人just舌,并且确实减轻了代码开发人员所知道的经典麻烦。但是,测试普通编程中未遇到的科学代码存在固有的困难,因此TDD文本作为教程并不是很有用。例如: 通常,对于先验的给定复杂问题,您不知道确切的答案,那么如何编写测试? 并行度改变;我最近遇到了一个错误,该错误将MPI任务作为3的倍数使用会失败,但是2的倍数有效。此外,由于MPI的本质,常见的测试框架似乎对MPI不太友好-您必须重新执行测试二进制文件以更改任务数。 科学法规通常包含许多紧密耦合,相互依存和可互换的部分。我们都已经看过遗留代码,并且我们知道放弃良好的设计并使用全局变量是多么诱人。 通常,数值方法可能是一种“实验”,或者编码人员无法完全理解它的工作原理并试图理解它,因此无法预期结果。 我为科学代码编写的一些测试示例: 对于时间积分器,请使用具有精确解决方案的简单ODE,并测试您的积分器是否在给定的精度范围内将其求解,并且通过使用不同步长进行测试来确定精度顺序是否正确。 零稳定性测试:检查边界/初始条件为0的方法是否保持为0。 插值测试:给定线性函数,请确保插值正确。 旧版验证:在已知正确的旧版应用程序中隔离大量代码,并提取一些离散值用于测试。 除了人工试验和错误之外,我常常想出如何无法正确测试给定的代码块。您能否提供一些为数字代码编写的测试示例和/或测试科学软件的一般策略?
16 testing 

3
Matlab神经网络工具箱的Python OSS替代品。有什么比较吗?
我希望自己的科研工作独立于商业软件。我发现对像Matlab这样的商业软件包及其工具箱的依赖性不理想,因为我不知道将来是否可以使用Matlab,并且因为我不喜欢这种语言。因此,我正在寻找替代方案。 幸运的是,我精通Python(并且我很喜欢这种语言),并且通过NumPy,SciPy,Matplotlib,Basemap和NetCDF读写例程,它可以满足我的大多数需求。大多数-当我需要使用前馈多层感知器(例如使用人工神经网络)来训练卫星检索时,我仍然回到Matlab。 与开源软件不同寻常的是,有不止一个软件包可以执行神经网络。不止一个: 不久前,我尝试了“用于神经网络的瑞士军刀” PyBrain,但在短时间内(开发时间和运行时间)都没有获得令人满意的结果。也许我没有尽力而为,或者它并不是真正针对我的实际需求。 刚才我发现有一个名为Neurolab的程序包,它看起来很有前途:一个简单而强大的Python神经网络库,带有一个MATLAB的API,例如Neural Network Toolbox(NNT)。 有FFnet,快速和易于使用的前馈Python的神经网络培训解决方案 有simplenn 有Peach,一个用于计算智能和机器学习的库 有Python绑定到FANN的快速人工神经网络库,描述为在这个StackOverflow的职位事实上的标准。 可能还有其他人。 是否有人根据易用性,速度等标准,对不同的选项进行了比较?我自己的用例是卫星检索,例如,拟合许多变量的强非线性函数。我非常一个用户神经网络的; 我对研究他们的内部运作方式不感兴趣。 有关Stats.SE的这个问题是相关的,但重点不同。

1
您如何调试数字代码,此振荡错误的根源是什么?
可以从经验中获得很多见识,我只是想知道以前是否有人看到过类似的东西。该图显示了对流扩散方程的初始条件(绿色),然后是迭代200(蓝色),然后是迭代400(红色)的解。 对流扩散方程的解经几次迭代后就爆炸了。Peclet数,和CFL条件满足时,Ç ≈ 0.0015,所以方程式应该是稳定的。我希望我在数字代码中有一个错误。μ 听,说:0.07μ≈0.07\mu\approx0.07C≈ 0.0015C≈0.0015C\approx 0.0015 背景。离散化是对流项和扩散项的主要区别。我相信这是平流的第一阶和扩散的第二阶。我已经使用有限体积的方法(第一次)实现了这一点,其中通过从单元格平均值进行线性插值找到了单元格面上的系数(速度和扩散系数)值。我在左右表面上应用Robin边界条件,并将边界处的通量设置为零。 您如何调试数字代码?以前有没有人出现过这样的场景,那么在哪里可以找到一个好地方? 更新资料 这是我关于平流扩散方程实施有限体积方法的个人“实验书”样式说明,http://danieljfarrell.github.io/FVM/ Python源代码可在此处获得,http://github.com/danieljfarrell/FVM.git 更新资料 解决方案再简单不过了!我只是在扩散项上犯了一个符号错误。很奇怪,我确定我还没有发布它,所以我不会发现错误!如果有人想分享有关如何调试数字代码的提示,我仍然很感兴趣。我没有方法,这有点碰运气,我一直在努力寻找线索,但是这个过程可能需要数周(有时)。 ××\times

4
矩阵的行主列与列主列布局
在对密集矩阵计算进行编程时,是否有任何理由要选择超过行的主布局的行主布局? 我知道,根据所选矩阵的布局,我们需要编写适当的代码以有效地将高速缓存用于速度目的。 以行为主的布局似乎更自然,更简单(至少对我而言)。但是用Fortran编写的LAPACK之类的主要库都使用列的主要布局,因此必须有一些选择的理由。
16 matrix  fortran 

4
统一与非统一网格
这可能是一个学生级别的问题,但我无法完全了解自己。为什么在数值方法中使用非均匀网格更准确?我想在一些有限差分法的情况下为形式的PDE üŤ(x ,t )= uX X(x ,t )üŤ(X,Ť)=üXX(X,Ť)u_t(x,t)=u_{xx}(x,t)。并假设我对点的解感兴趣X∗X∗x^{\ast}。因此,我可以看到,如果我近似二阶导数,例如在使用三点近似的均匀网格上,则误差为二阶Ø (^ h2)Ø(H2)O(h^2)。然后,我可以通过映射构造非均匀网格,并找到用于近似导数的三个点的系数。我可以进行泰勒展开,然后再次获得导数的界线,使其成为二阶Ø (^ h2)Ø(H2)O(h^2),其中HHh是在均匀网格上的距离​​,从该距离我可以获取到非均匀网格的映射。这两个估计都包含导数,我不清楚为什么在非均匀网格上求解会更准确,因为它取决于误差估计中相应导数的大小?

7
计算科学是否涉及编程?
我在Wikipedia上了解了计算科学,但是我的理解不是很清楚。 计算科学是否涉及编程?计算科学与计算_ ____有什么不同?计算_____的空白可以是任何学科(材料科学,工程学,化学,生物学等)?(我将从事计算材料科学。)

2
Boost :: mpi或C MPI用于高性能科学应用?
我最不喜欢MPI的一点是处理数据类型(即数据映射/掩码),因为它们与面向对象的C ++不太吻合。boost::mpi仅在其网站上支持MPI 1.1: boost :: mpi是标准消息传递接口的C ++友好接口……Boost.MPI可以使用Boost.Serialization库为用户定义的类型构建MPI数据类型。 有没有人boost::mpi对严肃的科学计算有任何经验?你会推荐吗?您是否遇到了任何问题(扩展问题,编译器问题,错误,未实现的功能,需要某些mpi 2.2功能)? 您能否评论使用boost::mpi而不是使用C ++中的MPI C实现?可以同时使用两者吗(可以的话,使用boost :: mpi,在其他地方使用C-MPI)? 您知道使用的任何大型科学代码boost::mpi吗?
16 hpc  c++  mpi 

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.