计算科学

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

10
关于可用的快速C ++矩阵库的建议?
是否有人对可用的快速C ++矩阵库有建议? 我的意思是以下内容: 矩阵对象具有直观的界面(例如:建立索引时可以使用行和列) 我可以使用LAPACK和BLAS做的矩阵类做任何事情 易于学习和使用的API 在Linux上安装相对容易(我现在使用Ubuntu 11.04) 对我而言,可用性比现在的速度或内存使用率更为重要,以避免过早的优化。在编写代码时,我总是可以使用一维数组(或STL向量)和适当的索引或指针算法来模拟矩阵,但我最好不要这样做,以免出现错误。我还想将精力集中在要解决的实际问题上,并编程到问题域中,而不是用有限的注意力来记住我以前将矩阵模拟为数组的所有编程技巧。 ,并记住LAPACK命令等等。另外,我必须编写的代码越少,标准化程度越高,效果越好。 稀疏还是稀疏无关紧要;我正在处理的某些矩阵将是稀疏的,但不是全部。但是,如果特定的程序包可以很好地处理密集或稀疏矩阵,则值得一提。 模板对我来说也没有太大关系,因为我将使用标准数字类型,并且不需要存储双精度,浮点型或整数型的东西。很好,但是对于我想做的事情不是必需的。

14
为科学研究代码编写单元测试是否值得?
我坚信使用验证完整程序的测试(例如收敛测试)的价值,包括一套自动化的回归测试。在阅读了一些编程书籍之后,我也感到I,我“应该”编写单元测试(即,用于验证单个函数正确性并且不等于运行整个代码来解决问题的测试)。 。但是,单元测试似乎并不总是与科学规范相适应,并且最终会感到虚假或浪费时间。 我们应该为研究代码编写单元测试吗?

10
哪些问题很适合GPU计算?
因此,对于要解决的问题,最好的解决方法是串行解决,并且可以并行管理。但是现在,我对基于CPU的计算可以最好地处理什么以及应该将哪些内容卸载到GPU的想法还不多。 我知道这是一个基本问题,但是我的大部分搜索工作都被清楚地主张一个或另一个的人们所困扰,而他们并没有真正证明为什么或有些模糊的经验法则。在这里寻找更有用的回应。
84 gpu 

17
是否有适用于Python的高质量非线性编程求解器?
我要解决几个具有挑战性的非凸全局优化问题。目前,我使用了MATLAB的Optimization Toolbox(特别是fmincon()使用algorithm = 'sqp'),它非常有效。但是,我的大部分代码是在Python中进行的,我也想在Python中进行优化。是否存在可以与Python绑定竞争的NLP求解器fmincon()?它必须 能够处理非线性等式和不等式约束 不需要用户提供雅可比行列式。 如果不保证全局最优(fmincon()没有),也可以。我正在寻找一种即使在遇到挑战性问题时也可以收敛到局部最优的东西,即使它比慢一些fmincon()。 我尝试了OpenOpt提供的几种求解器,发现它们不如MATLAB的fmincon/sqp。 只是为了强调,我已经有了一个易于处理的公式和一个好的求解器。我的目标仅仅是更改语言,以使工作流程更加简化。 Geoff指出问题的某些特征可能是相关的。他们是: 10-400个决策变量 4-100个多项式相等约束(多项式范围从1到大约8) 有理不等式约束的数量大约等于决策变量数量的两倍 目标函数是决策变量之一 等式约束的雅可比行列是密集的,不等式约束的雅可比行列是密集的。

6
Fortran编译器真的好多少?
这个问题是对“ HPC的C ++ vs Fortran ”的答复中最近进行的两个讨论的扩展。而且,这不仅仅是一个挑战,而不是一个问题... 支持Fortran的最常听到的论据之一是编译器更好。由于大多数C / Fortran编译器共享相同的后端,因此为两种语言在语义上等效的程序生成的代码应该相同。但是,有人可能会争辩说,对于编译器来说,C / Fortran更容易实现优化。 因此,我决定尝试一个简单的测试:我获得了daxpy.f和daxpy.c的副本,并使用gfortran / gcc对其进行了编译。 现在daxpy.c只是daxpy.f(自动生成的代码,很难看的丑陋的)的f2c转换,所以我拿走了这段代码并对其进行了一些清理(满足daxpy_c),这基本上意味着将最里面的循环重写为 for ( i = 0 ; i < n ; i++ ) dy[i] += da * dx[i]; 最后,我使用gcc的向量语法重新编写了它(输入daxpy_cvec): #define vector(elcount, type) __attribute__((vector_size((elcount)*sizeof(type)))) type vector(2,double) va = { da , da }, *vx, *vy; vx = ...
74 fortran  c  blas  benchmarking 

10
有什么好的策略可以改善我的代码的串行性能?
我从事计算科学方面的工作,结果,我花费了大量的时间来尝试提高许多代码的科学吞吐量,并了解这些代码的效率。 假设我已经评估了我正在开发的软件的性能与可读性/可重用性/可维护性之间的权衡,并且我决定是时候提高性能了。我们还假设我知道我没有针对我的问题的更好算法(就flop / s和内存带宽而言)。您还可以假设我的代码库使用的是C,C ++或Fortran之类的低级语言。最后,我们假设代码中没有并行性,或者我们只对单个内核的性能感兴趣。 首先要尝试的最重要的事情是什么?我怎么知道我可以获得多少性能?

12
C ++与Fortran for HPC
在我的计算科学博士学位程序中,我们几乎只在C ++和Fortran中工作。似乎有些教授更喜欢另一种。我想知道哪个在某些情况下是“更好”的,还是一个在另一个方面要比另一个更好。
56 hpc  fortran  c++  languages 

5
如何对空间不均匀的数据进行FFT?
快速傅立叶变换算法在以下假设条件下计算傅立叶分解:输入点在时域中均等分布,Ťķ= ķ ŤŤķ=ķŤt_k = kT。如果不是,那该怎么办?我是否可以使用另一种算法,或者以某种方式修改FFT,以说明什么是有效的可变采样率? 如果解决方案取决于样本的分发方式,那么我最感兴趣的是两种特定情况: 恒定的采样速率与抖动:其中δ 吨ķ是随机分布的变量。可以肯定地说| δ Ť ķ | &lt; T / 2Ťķ= ķ Ť+ δŤķŤķ=ķŤ+δŤķt_k = kT + \delta t_kδŤķδŤķ\delta t_k| δŤķ| &lt;T/ 2|δŤķ|&lt;Ť/2|\delta t_k| < T/2。 丢弃样品从否则恒定采样率:其中Ñ ķ ∈ ž ≥ ķŤķ= nķŤŤķ=ñķŤt_k = n_k Tñķ∈ ž ≥ ķñķ∈ž≥ķn_k \in\mathbb{Z}\ge k 动机:首先,这是对此站点的提案投票较高的问题之一。但是此外,不久前,我参与了有关FFT使用的讨论(由Stack Overflow的问题提示),其中出现了一些采样点不均匀的输入数据。原来,数据上的时间戳是错误的,但是这让我开始思考如何解决这个问题。

4
“ Julia”科学计算语言项目的成熟程度如何?
我正在考虑学习一种用于数值/模拟建模项目的新语言,以(部分)替代当前使用的C ++和Python。我遇到了朱莉娅,这听起来很完美。如果它能完成它声称的一切,我可以用它来代替C ++ 和在所有项目中 Python,因为它可以访问高级科学计算库代码(包括PyPlot),并且可以以与C相似的速度运行循环。我还将受益于其他语言中都不存在的诸如适当的协程之类的东西。 但是,这是一个相对较新的项目,当前版本为0.x,我发现各种警告(在过去的不同日期发布)表明它还不能为日常使用做好准备。因此,我想立即获得有关该项目状态的一些信息(2014年2月,或每当发布答案时),以帮助我评估我个人是否应考虑在此阶段花时间学习这种语言。 我希望您能获得有关朱莉娅项目具体相关事实的答案。 ; 我对基于其他项目经验的观点不感兴趣。 特别是,Geoff Oxberry的评论表明,Julia API仍处于不断变化的状态,需要在代码更改时对其进行更新。我想了解一下这种情况的程度:API的哪些区域是稳定的,哪些区域可能会发生变化? 我想通常我通常会做线性代数(例如,解决本征问题),对具有多个变量的ODE进行数值积分,使用PyPlot和/或OpenGL进行绘图以及低级C样式数字运算(例如,用于蒙特卡洛模拟) )。朱莉娅的图书馆系统在这些领域是否得到充分发展?尤其是对于这些类型的活动,API或多或少是稳定的,还是我会发现我的旧代码在升级到新版本的Julia后会趋于破坏? 最后,在确定当前是否使用Julia进行认真的工作时,还有其他值得考虑的问题吗?

17
不将库用于标准数值算法是常见的,为什么?
科学计算库(如GSL)中提供了许多数值算法(积分,微分,内插,特殊函数等)。但是我经常看到带有这些功能的“手动”实现的代码。对于不一定要公开发行的小型程序,计算科学家是否普遍习惯在需要时自行实施数值算法(我的意思是从网站,数值食谱或类似软件进行复制或转录)?如果是这样,是否有特定的原因要避免链接到GSL之类的东西,还是比其他东西更“传统”? 我问是因为我是代码重用的忠实拥护者,这表明我应该尽可能尝试使用现有的实现。但是我很好奇,是否有理由认为原理在科学计算中没有在一般编程中那么有价值。 忘了提一下:我特别是在问C和C ++,而不是像Python这样的语言,使用Python有明显的好处(执行速度)。
54 libraries  c 

7
每位计算科学家应具备哪些核心技能?[关闭]
每个科学家都需要对统计知识有所了解:什么是相关性,什么是置信区间,等等。同样,每个科学家都应该对计算有所了解:问题是什么?期望每个在职的科学家都知道有关构建和使用软件的合理知识吗?我们列出的核心技能是-人们在以“ cloud”或“ peta”为名处理任何事物之前应了解的事情-是: 基本编程(循环,条件,列表,函数和文件I / O) shell /基本的shell脚本 版本控制 测试多少程序 基本SQL 这个列表中没有很多东西:矩阵编程(MATLAB,NumPy等),使用得当的电子表格,它们与大多数编程语言一样强大),诸如Make的任务自动化工具,等等。 那么:您的清单上有什么?您认为现在期望每个科学家都知道吗?您会从上面的列表中拿出什么来腾出空间吗?没有人有足够的时间学习一切。
52 education 

4
选择稀疏线性系统求解器时应遵循哪些准则?
稀疏线性系统在应用中会随着频率的增加而出现。解决这些系统有很多例程可供选择。在最高级别,直接方法(例如,稀疏的高斯消除或Cholesky分解,使用特殊的排序算法和多前沿方法)与迭代方法(例如,GMRES,(双)共轭梯度)方法之间存在分水岭。 如何确定使用直接方法还是迭代方法?做出了这样的选择之后,如何选择一种特定的算法?我已经知道对称性的利用方法(例如,将共轭梯度用于稀疏对称正定系统),但是在选择方法时还需要考虑其他类似因素吗?

3
有限元法和有限体积法之间的概念区别是什么?
有限差分法与有限体积法之间存在明显的区别(从方程的点定义到单元的积分平均值)。但是我发现FEM和FVM非常相似。它们都使用整数形式并且对单元进行平均。 FVM不能执行的FEM方法是什么?我已经阅读了一些关于FEM的背景知识,我知道方程式是用弱形式编写的,这使该方法的陈述点与FVM略有不同。但是,我不从概念上理解差异是什么。FEM是否对单元内部未知物的变化做出一些假设,FVM不能做到吗? 我主要来自1D角度,所以也许FEM在多个方面都具有优势? 我在网上没有找到太多有关此主题的信息。Wikipedia上有一节介绍了FEM与有限差分法的区别,http://en.wikipedia.org/wiki/Finite_element_method#Comparison_to_the_finite_difference_method就是其中一部分。

5
在有限差分和有限元素之间选择的标准是什么
我习惯在有限的网格上将有限差分视为有限元的一种特殊情况。那么,如何在有限差分法(FDM)和有限元方法(FEM)之间进行数值选择的条件是什么? 在有限差分法(FDM)方面,可以认为它们在概念上比有限元方法(FEM)更简单,更容易实现。FEM具有非常灵活的优势,例如,网格可能非常不均匀,并且域可能具有任意形状。 我知道FDM优于FEM的唯一例子是在 Celia,Bouloutas,Zarba,那里的收益归功于FD方法使用不同的时间导数离散化,但是对于有限元方法可以固定。

8
记录科学软件的好方法是什么?
很多时候,当我继承或遇到其他人编写的科学代码(或偶而甚至是我自己的工作)时,我注意到文档稀疏或不存在。如果幸运的话,我会看到翔实的评论。如果我很幸运,甚至还有Doxygen注释和Doxyfile,这样我就可以使用函数接口和一些格式化的HTML进行查阅。如果我非常幸运,除了Doxygen和源文件注释之外,还有PDF手册和示例,我很欣喜,因为它使我的生活变得非常轻松。 哪些信息和工具可用于记录源代码?因此,对于科学软件,哪些信息和工具可用于记录与该源代码一起的数据和结果?

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.