计算科学

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

2
是否可以不使用Newton-Raphson迭代来求解非线性PDE?
我试图了解一些结果,并希望对解决非线性问题提出一些一般性意见。 Fisher方程(非线性反应扩散PDE), üŤ= düX X+ βu (1 − u )= F(你)üŤ=düXX+βü(1个-ü)=F(ü) u_t = du_{xx} + \beta u (1 - u) = F(u) 以离散的形式 ü′Ĵ= L u + βüĴ(1 − uĴ)= F(你)üĴ′=大号ü+βüĴ(1个-üĴ)=F(ü) u_j^{\prime} = \boldsymbol{L}\boldsymbol{u} + \beta u_j (1 - u_j) = F(\boldsymbol{u}) 其中大号大号\boldsymbol{L}是微分算子,你= (你j − 1,üĴ,üj + 1)ü=(üĴ-1个,üĴ,üĴ+1个)\boldsymbol{u}=(u_{j-1}, u_j, u_{j+1}) …

1
我可以相信Matlab提供的这个数值三重积分吗?
计算科学的人: 我最初将此问题发布在Math Stack Exchange上,有人评论说我的答案可能会“好得多”: 我是数值方法和Matlab的新手。我正在尝试评估以下两个三重积分之和(显然可以将其写得更简单,但是您仍然不能象征性地对其进行评估(?))。我在拿L时遇到麻烦在这里工作,所以我很不情愿地将它分解成碎片:我想找到大号一种ŤËX大号一种ŤËX\LaTeX 2((1 / 0.3 )− 1 )2(∫1 / 0.31个∫[R1个1个∫[R1个- - [R00F1个([R0,[R1个,t )exp(- (0.3 )2Ť24)dŤd[R0d[R1个),2((1个/0.3)-1个)2(∫1个1个/0.3∫1个[R1个∫0[R1个-[R0F1个([R0,[R1个,Ť)经验值⁡(-(0.3)2Ť24)dŤd[R0d[R1个),\frac{2}{((1/0.3) - 1)^2}\left(\int_1^{1/0.3}\int_1^{r_1}\int_0^{r_1-r_0}F_1(r_0,r_1,t)\exp(-\frac{(0.3)^2 t^2}{4})\,dt\,dr_0\,dr_1 \right), 和 2((1 / 0.3 )− 1 )2(∫1 / 0.31个∫[R1个1个∫[R1个+ r0[R1个- - [R0F2([R0,[R1个,t )exp(- (0.3 )2Ť24)dŤd[R0d[R1个),2((1个/0.3)-1个)2(∫1个1个/0.3∫1个[R1个∫[R1个-[R0[R1个+[R0F2([R0,[R1个,Ť)经验值⁡(-(0.3)2Ť24)dŤd[R0d[R1个),\frac{2}{((1/0.3) - 1)^2}\left(\int_1^{1/0.3}\int_1^{r_1}\int_{r_1-r_0}^{r_1+r_0} F_2(r_0,r_1,t)\exp(-\frac{(0.3)^2 t^2}{4})\,dt\,dr_0\,dr_1 \right), 哪里 F1个([R0,[R1个,t )= t2[R30∗ (0.3 )32 r31个π--√F1个([R0,[R1个,Ť)=Ť2[R03∗(0.3)32[R1个3πF_1(r_0,r_1,t)=\frac{t^2 r_0^3*(0.3)^3}{2r_1^3\sqrt{\pi}} …
15 matlab 

2
用Neumann边界条件写泊松方程有限差分矩阵
我对使用有限差分法求解泊松方程感兴趣。我想更好地了解如何用Neumann边界条件编写矩阵方程。有人会审查以下内容,对吗? 有限差分矩阵 泊松方程, ∂2u(x)∂x2=d(x)∂2u(x)∂x2=d(x) \frac{\partial^2u(x)}{\partial x^2} = d(x) 可以用有限差分矩阵方程近似 1(Δx)2M∙u^=d^1(Δx)2M∙u^=d^ \frac{1}{(\Delta x)^2} \textbf{M}\bullet \hat u = \hat d 其中是矩阵,和是(列)向量, Ñ × Ñ ù ð 1 × Ñ中号中号\textbf{M}n × nñ×ñn \times nü^ü^\hat ud^d^\hat d1 × n1个×ñ1 \times n 添加Neumann边界条件 诺伊曼边界条件会在边界处强制产生一个已知通量(此处我们将其应用到边界位于的左侧),x = 0X=0x=0 ∂u (x = 0 )∂X= σ∂ü(X=0)∂X=σ \frac{\partial u(x=0)}{\partial x} …

3
解决PDE的多重网格方法
我需要对Multigrid方法的简单解释或有关此的一些文献。 我熟悉BiCGStab,CG,GS,Jacobi和预处理等迭代方法,但是我是使用多网格方法的初学者。 有人可以详细解释这一点,或者至少提供清晰的伪代码或源代码,即使对于初学者来说,也有很好的文献资料?谢谢!

1
如何使用自己的代码轻松地在自己的文章中复制已发布的结果
我写了一个程序/库,用来在一篇文章中获得结果。(这里是,但是我的问题很笼统。)我有定期使用的测试ctest(运行需要几分钟)。为了重现文章中的某些表格或图表,我必须构建一个脚本或一个简单的驱动程序,该程序可能运行10分钟,有时甚至更长,因此我不想将其包含在常规测试套件中。同时,我想确保本文的结果可以是: 后来转载 在我继续开发库之后,请确保它们仍然给出相同/正确的结果 目前,我尝试拥有一个作为常规测试套件一部分运行的小型驱动程序,如果要重现本文的结果,请取消注释其中的几行。当然,我永远不知道确切的行以及是否必须调整一些其他参数才能获得与文章中完全相同的结果。 我还尝试过使用Python脚本来计算文章中的确切数字/表格。此类脚本通常在库更新后停止工作,因为它不是定期运行(占用太多时间)。 我想到的最好的方法是有一个Fortran(或C / C ++)示例,该示例将定期编译(作为库的一部分),但不能在常规测试套件中运行。这样,至少我知道它可以很好地编译(因此希望也可以运行)。作为常规测试套件的一部分,我将测试一些简单(较小)的示例。 解决此问题的最佳方法是什么?

1
多项式前置条件的当前状态是什么?
我不知道多项式前置条件发生了什么。我对它们感兴趣,因为从数学角度看它们看上去比较优雅,但是据我在有关克雷洛夫方法的调查中所读到的那样,它们作为预处理器的性能通常很差。用Saad和van der Host的话说,“对这些技术的当前兴趣几乎消失了” (此处)。但是,最近在多核和GPU计算中已得到使用。 谁能告诉我或者更确切地说是我在哪些情况下这些方法仍然有效,以及在哪里可以找到有关当前最新技术水平的良好调查?

1
天文学模拟中正确的整合方式是什么?
我正在创建一个简单的天文模拟器,该模拟器应使用牛顿物理学来模拟系统(或任何物体)中行星的运动。所有的物体都是在欧几里得平面上的圆,具有诸如位置,速度,质量,半径和合力之类的属性。 我想以较小的时间步长(通常是几毫秒)来更新Universe,但是我不确定如何正确计算位置的变化。 力很简单:fr = sum(G * body.m * bodyi.m / dist(body, bodyi)^2)。 但是我怎么从那里继续呢? 我可以这样做: a = Fr/body.m v += a*dt position += v*dt 但这当然是错误的。也许我在位置计算中添加了0.5作为因素?

1
可视化不连续的Galerkin /有限元数据
我想在ParaView中可视化使用不连续Galerkin(DG)方法获得的仿真结果。与有限体积方法类似,问题域被划分为立方体形的单元(“元素”)。与有限体积方法相反,每个像元中不仅有一个解向量,而且每个像元在多个高斯积分点处都包含解。üüu\mathbf{u}üu\mathbf{u} 我的问题是,是否有人有使用ParaView / VTK有效地可视化此类数据的经验,以及您选择了哪种方法来表示VTK中的数据。我想到了几种可能的方法,但我不知道哪种方法最有前途: (1)使用体 素每个集成点使用一个体素。 Pro:所有与标准VTK非结构化单元类型一起使用的插件将继续工作,而无需进行任何更改。 缺点:由于积分点分布不均匀,因此可能难以找到顶点的正确位置。同样,由于DG框架允许使用不连续的溶液,因此可以在细胞表面上定义两次溶液。同样,层次信息(域划分为元素,每个元素包含几个点)也会丢失。 (2)使用多 顶点每个积分点使用一个顶点。 专业:最容易实现,易于使用不同的解决方案在同一位置指定多个点。 缺点:能力来可视化数据为“细胞”丢失,加上相同的缺点如上。 (3)使用VTK正交方案 使用对正交方案的内置支持。 优点:相当简单的实现,保留了原始解决方案的所有关系和属性。 缺点:由于这是一种全新的单元格类型,因此许多(大多数)现有插件将不再起作用,可能必须重写。

2
函数的有理逼近的开源实现
我正在寻找某种对函数有理近似的开源实现(Python,C,C ++,Fortran都可以)。文章[1]中的内容。我给了它一个函数,它给了我两个多项式,它们的比率是在给定间隔上的近似值,并且误差以相同的幅度振荡,并且是一个最佳近似值,或者接近于它。 这是我发现的: 看起来chebfun可以做到,但我无权使用Matlab *。 在数字食谱(NR)的5-13节“理性切比雪夫近似”中有一个简单的程序。 Mathematica具有EconomizedRationalApproximation和MiniMaxApproximation 我想知道是否有比NR代码更新的东西(可能经过更好的测试)。 我的应用程序是我有一组特殊功能,大约10个,以超几何级数或具有数值抵消的公式给出,我想拥有一个健壮,快速且准确的评估函数,称为Hartree Fock计算中计算两个粒子矩阵元素的最内层循环。我在[2]处提供了一个对我有用的函数的简单示例。如您所见,它要么使用直接公式,要么使用我使用SymPy计算的x = 0周围的序列。它可以工作,但准确性不高,大约x = 1时,大约一半的有效数字会丢失(但是对于x = 0.1以及x = 1e5,它几乎对所有有效数字都是准确的)。我正在寻找更好的近似值。 [1] Deun,J.和Trefethen,LN(2011)。Carathéodory-Fejér方法的有力实现,用于有理逼近。BIT数值数学,51(4),1039–1050。doi:10.1007 / s10543-011-0331-7(2010年6月电子版) [2] https://gist.github.com/3831580 (*)chebfun网站也没有,它给我404,但是Pedro建议这一定是我的提供商问题。

3
不连续rs ODE的数值方法
具有不连续右侧的ODE数值求解的最新方法是什么?我最感兴趣的是分段平滑的右侧函数,例如sign。 我正在尝试解决以下类型的方程式: x˙v˙=v={(|Fexternal|−|Ffriction|)sign(Fexternal)0:|Fexternal|&lt;|Ffriction|:otherwisex˙=vv˙={(|Fexternal|−|Ffriction|)sign⁡(Fexternal):|Fexternal|&lt;|Ffriction|0:otherwise\begin{align*} \dot x &= v\\ \dot v &= \begin{cases} (|F_\text{external}| - |F_\text{friction}|) \mathop{\rm sign} (F_\text{external}) & :|F_\text{external}| < |F_\text{friction}|\\ 0 & : \text{otherwise} \end{cases} \end{align*}
15 ode 

4
测试数值优化方法:Rosenbrock与实际测试函数
对于无导数优化器,似乎有两种主要的测试函数: 像Rosenbrock函数 ff 这样的 单线,带有起点 带有插值器的一组真实数据点 是否可以将10d Rosenbrock与任何实际的10d问题进行比较? 一个人可以用多种方式进行比较:描述局部极小值的结构, 或者在Rosenbrock上和一些实际问题上运行优化器ABC; 但是这两者似乎都很困难。 (也许理论家和实验者只是两种截然不同的文化,所以我要求一种嵌合体吗?) 也可以看看: scicomp.SE问题:在哪里可以获取用于测试算法/例程的良好数据集/测试问题? 胡克(Hooker)的《测试启发式方法:我们全错了》令人发指:“对竞争的重视……告诉我们哪种算法更好,但为什么却不行。” (在2014年9月增补): BOBYQA PRAXIS SBPLX从:小区下面从10个随机起始点比较在图8d 14个测试功能3种DFO算法NLOpt 14 N维测试功能,Python的下gist.github 从这个Matlab的由A. 每个函数的边界框中的Hedar × 10个均匀随机的起点。××\times ××\times 例如,在Ackley上,第一行显示SBPLX最好,PRAXIS糟糕;在Schwefel上,右下方的面板显示SBPLX在第5个随机起点上找到了最小值。 总体而言,BOBYQA在1,PRAXIS,5和SBPLX(〜具有重新启动功能的Nelder-Mead)上最好,在13个测试功能中有7个,并且Powersum值得一提。YMMV!约翰逊特别指出:“我建议您在全局优化中不要使用函数值(ftol)或参数公差(xtol)。” 结论:不要把所有的钱都花在一匹马或一项测试功能上。

1
如何数值计算残渣?
我需要计算以下积分: 其中是一个矩阵(一个粒子的动能和势能以基数表示),是一个依赖于的矩阵(一个单粒子多-体格林函数),轮廓积分是左半圆。积分在负实轴上具有极点,因此评估起来很昂贵。计算这种积分最有效的方法是什么?1个2个π一世∫CF(è)dË1个2π一世∫CF(Ë)dË {1\over 2\pi i} \int_C f(E) \, d E F(è)= T r((h + E)G(E))f(Ë)=Ť[R((H+Ë)G(Ë)) f(E) = {\rm Tr}\,\left(({\bf h} + E)\,{\bf G}(E) \right) HH\bf hGG\bf GËËEF(è)F(Ë)f(E) 到目前为止,这是我的研究: 1)我使用高斯积分,我的积分路径是一个矩形。我固定了左侧和右侧(即宽度),并以高度(在实轴上方和下方)播放,因此对于给定的积分顺序,我可以获得最高的精度。例如,对于20阶,如果高度太大,则精度会下降(很明显),但是如果它太小,则精度也会下降(我的理论是,随着高度的增加,极点周围需要越来越多的点0)。我将功能的最佳高度定为0.5。 2)然后我将矩形的右侧设置为E0,通常为E0 = 0,但也可以是E0 = -0.2或类似的值。 3)我开始将矩形的左侧移到左侧,并为每一步进行积分顺序收敛,以确保每个矩形的积分都完全收敛。通过增加宽度,我最终在无穷左半圆的极限处得到了一个收敛值。 计算确实很慢,而且对于大宽度也不太准确。一种改进是将长宽度简单地划分为“元素”,并对每个元素使用高斯积分(就像在FE中一样)。 另一个选择是在每个极点周围集成一个小圆圈并将其汇总。问题: a)如何从数值上找到函数的极点?它应该很健壮。我唯一知道的是它们在负实轴上。对于其中一些(但不是全部),我也知道一个很好的初步猜测。是否存在适用于任何解析函数?还是取决于的实际形式?F(è)F(Ë)f(E)F(è)F(Ë)f(E)F(è)F(Ë)f(E) b)一旦我们知道了极点,哪种数值方案最适合积分围绕它的小圆圈?我应该在圆上使用高斯积分吗?还是应该使用点的均匀分布? 另一个选择可能是,一旦有了a)我就知道了极点,那么可能会有一些半解析的方式来获得残基,而无需复杂的集成。但是现在,我很乐意仅优化轮廓集成。

2
对流方程的隐式有限差分格式
有许多FD方案为平流式在web讨论。例如在这里:http: //farside.ph.utexas.edu/teaching/329/lectures/node89.html∂Ť∂Ť+ 你∂Ť∂X= 0∂Ť∂Ť+ü∂Ť∂X=0\frac{\partial T}{\partial t}+u\frac{\partial T}{\partial x}=0 但是我还没有看到有人提出过这样的“隐式”迎风方案: 。Ťn + 1一世- Ťñ一世τ+ ü Ťn + 1一世- Ťn + 1i − 1HX= 0Ť一世ñ+1个-Ť一世ñτ+üŤ一世ñ+1个-Ť一世-1个ñ+1个HX=0\frac{T^{n+1}_i-T^{n}_i}{\tau}+u\frac{T^{n+1}_i-T^{n+1}_{i-1}}{h_x}=0 我所看到的所有逆风方案都是处理空间导数上一个时间步的数据。是什么原因呢?经典的迎风方案与我上面写的相比如何?

3
粒子分解和域分解并行化算法的优缺点是什么?
我正在使用几个软件包(例如Gromacs和DL_POLY)运行分子动力学(MD)模拟。 Gromacs现在支持粒子分解和域分解算法。默认情况下,Gromacs模拟使用域分解,尽管直到最近,多年以来,粒子分解是Gromacs中唯一实现的方法。在Gromacs的一篇论文(DOI 10.1002 / jcc.20291)中,作者给出了最初选择粒子分解的原因: “早期的设计决策是选择使用粒子分解而不是域分解来将工作分配到处理器上。在后一种情况下,将空间域分配给处理器,这使得仅通过本地通信即可快速找到空间邻居,但是会带来复杂性对于跨越空间边界的粒子而言,域分解是一个更好的选择,只有当线性系统的大小大大超出相互作用范围时,分子动力学中才很少发生这种情况,通过粒子分解,每个处理器都可以计算力和坐标/速度更新对于预先分配的粒子,使用预先计算的邻居列表均匀分布在处理器上。F我 ĴF一世ĴF_{ij}从颗粒之间的一对相互作用产生一世一世i 和ĴĴj,这是需要两种粒子的速度更新和 一世一世iĴĴj,仅计算一次,并传达给其他处理器。每个处理器将系统的完整坐标集保留在其本地内存中,而不是将存储限制在所需的坐标范围内。这更简单并节省了通信开销,而内存要求通常根本不是限制因素,即使对于数百万个粒子也是如此。另一方面,可以包含多达1000倍粒子数量的邻居列表分布在处理器上。基本上,通信仅限于围绕处理器环的每个时间步发送一次坐标和力。这些选择随着时间的推移被证明是可靠的,并且很容易适用于现代处理器集群。” 句子“仅当线性系统的大小大大超过相互作用范围时,才是域选择是一个更好的选择,这在分子动力学中很少见”,它们是什么意思?从上面的段落中,我得到一种想法,即粒子分解的优点是不必处理跨域边界移动的粒子。相反,您只需要为每个处理器有足够的内存来存储整个系统配置即可。因此,粒子分解看起来非常有利,而域分解看起来非常不利。 我确信这是一个非常复杂的问题(可能是许多书籍的主题),但是基本上,如果粒子分解看起来如此有利,为什么有人需要使用域分解? 如果系统规模很大(使每个处理器都难以或不可能存储整个配置),则域分解是否有利?基于上面引用的段落,我不确定为什么最近刚将域分解作为Gromacs中的默认并行化算法。 似乎现在的DL_POLY(版本4)也使用域分解。从版本4手册中: “以这种方式对配置数据进行划分是基于原子在模拟单元中的位置,系统数据的这种几何分配是DD算法的特点。请注意,为了使该策略有效地起作用,系统必须具有合理均匀的密度,以便为每个处理器分配几乎相等的原子数据部分(尽可能多),通过这种方法,在处理器和该方法在概念上很简单,尽管编程很麻烦,但在概念上却很简单,特别适合效率最高的大规模仿真。 ... 在使用DD策略的情况下,SHAKE(RATTLE)算法比DL_POLY Classic的“复制数据”方法更简单,后者需要原子位置的全局更新(合并和剪接)。” 这听起来好像域分解是好的,因为它可能更有效,即使可能更难以实现。 另一方面,以前的版本(DL_POLY Classic)使用了复制数据并行化,这似乎是粒子分解的另一个名称。从该版本的手册中: 复制数据(RD)策略是在MD中实现并行化的几种方法之一。从配置数据的并行计算机中的每个节点(在复制其名称导出即阵列限定的原子坐标,速度 ,和力,对于全部[R一世[R一世\textbf{r}_iv一世v一世\textbf{v}_iF一世F一世\textbf{f}_iññN在模拟系统中的每个原子都在每个处理节点上重现。在这种策略中,大多数力的计算和运动方程的积分可以在节点之间轻松而平等地共享,并且在很大程度上可以在每个节点上独立进行处理。该方法编程相对简单并且相当有效。而且,它很容易在单个处理器上“崩溃”运行。但是,该策略在内存中可能很昂贵,并且具有较高的通信开销,但总的来说,它已被证明在各种应用程序中都是成功的。 该段似乎与该问题的第一段基本一致,不同之处在于它说复制的数据/粒子分解具有“高通信开销”。Gromacs论文的段落似乎相反-粒子分解是更可取的,因为它比域分解具有较低的通信开销。 你有什么想法吗?

4
数值分析的书籍参考
我在微积分课上瞥了一眼数值分析(主要是数值方法,例如求根,二次方程式和其他初步的东西),但是现在,我发现自己希望自己的工作更加复杂。 有没有一本好书可以从更一般的角度帮助我理解算法的稳定性,设计稳定的算法,错误传播,收敛性分析等概念? 本质上,我希望能够更好地理解和分析Krylov子空间方法(QMR,GMRES和CG)以及一些非线性优化算法。特别是,浮点近似如何影响算法。 我所见过的大多数书籍的问题是,它们是在假定读者对线性代数一无所知的情况下开始的,并介绍了我不需要的LU,高斯消除,QR等基础知识。我想要的只是数值分析的“鸟瞰图”,而无需深入研究特定方法。简短将不胜感激。

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.