计算科学

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

2
使用LAPACK和BLAS 对求解
我正在将现有代码从MATLAB移植到C ++,并具有一个线性系统来解决(而不是更典型的形式)A x = bxA=bxA=bxA=bAx=bAx=bAx=b 矩阵是密集的,具有一般形式,但不大于1000x1000。因此在MATLAB中,可以通过函数或正斜杠表示法找到解决方案AAAmrdivide(b,A)x = b/A; 如何使用BLAS和LAPACK例程在C ++代码中解决此问题? 我熟悉的LAPACK程序DGESV解决了为。xAx=bAx=bAx=bxxx 因此,我的一个想法是使用矩阵转置身份进行一些操作: (xA)T=bT(xA)T=bT(xA)^T=b^T ATxT=bTATxT=bTA^T x^T = b^T xT=(AT)−1bTxT=(AT)−1bTx^T = (A^T)^{-1} b^T 然后通过DGESV对转置的进行运算来求解最终形式。(因此转置成本和解决系统的成本)一ATATA^TAAA 有没有一种方法更有效或以其他方式更好? 我正在使用矩阵和向量类以及BOOST uBLAS库中的BLAS实现以及与LAPACK库例程的绑定。我已经成功地将此设置用于其他操作,并希望找到限于这些库的解决方案。 另外,我应该注意,我在代码设置期间仅执行了几次此类操作,因此性能并不是关键问题。 也许此MATLAB 文档对其mrdivide他人有帮助。

3
适用于许多右侧的稀疏线性求解器
我需要用多个右侧(300至1000)来解决相同的稀疏线性系统(300x300至1000x1000)。除了第一个问题外,我还想解决不同的系统,但是具有相同的非零元素(只是不同的值),那就是许多稀疏系统具有恒定的稀疏性模式。我的矩阵是不确定的。 分解和初始化的性能并不重要,但是求解阶段的性能很重要。目前,我正在考虑使用PaStiX或Umfpack,并且我可能会使用Petsc(支持这两个求解器)是否有能够利用我的特定需求(向量化,多线程)的库,或者我应该依赖于通用求解器?也许根据我的需要对其进行一些修改? 如果稀疏矩阵大到怎么办?106× 106106×10610^6 \times 10^6

1
* full *多重网格算法如何运行?
因此,我了解(或至少我相信我知道)V周期的运行方式。我已经在Matlab中编写了V周期的一维递归版本。但是,当我为FMG运行代码时,我的解决方案并未收敛。我相信我的麻烦在于我对FMG实际部分的理解。我目前所知道的是: 只是之前FMG插值,我放松了我的解决方案üuu 插值两个错误和 (?)üuu 执行2网格v循环,将错误传递到v循环(?) 放宽错误(在第二个最粗网格上) 插值和错误üuu 通过添加错误来更新。üuu 运行一个v周期,然后从步骤4开始重复。 我不确定顺序,但是我插值并传递给v周期的确切信息也可能是错误的。如果我在算法中缺少任何内容,请告诉我。
12 multigrid 

5
使用相同的,不同的重复求解
我正在使用MATLAB解决一个涉及解决,其中每个时间步随着时间变化。现在,我正在使用MATLAB的:bAx=bAx=b\mathbf{A} \mathbf{x}=\mathbf{b}bb\mathbf{b}mldivide x = A\b 我可以灵活地进行所需的预计算,因此我想知道是否有比更快和/或更准确的方法mldivide。通常在这里做什么?谢谢大家!

4
异步蜂窝自动机的并行(GPU)算法
我有一组计算模型,这些模型可以描述为异步蜂窝自动机。这些模型类似于Ising模型,但稍微复杂一些。这样的模型似乎可以从在GPU而非CPU上运行中受益。不幸的是,并行化这样一个模型不是很简单,而且我也不清楚如何去实现它。我知道有关于该主题的文献,但似乎所有这些文献都是针对对算法复杂性细节感兴趣的铁杆计算机科学家,而不是像我这样只想要描述我可以实现的东西的人,以及因此,我觉得它是不可渗透的。 为了清楚起见,我并不是在寻找最佳算法,而是希望可以在CUDA中快速实现的最佳算法比我的CPU实现有明显的提高。在这个项目中,程序员的时间比计算机的时间更多地是一个限制因素。 我还应该澄清,异步蜂窝自动机与同步自动机是完全不同的事情,并且并行化同步CA的技术(例如Conway的生活)不能轻易地适应此问题。区别在于,同步CA在每个时间步同时更新每个小区,而异步CA在每个时间步更新随机选择的本地区域,如下所述。 我希望并行化的模型是在由约100000个单元组成的网格(通常是六角形)上实现的(尽管我想使用更多),用于运行它们的非并行算法如下所示: 随机选择一对相邻的单元格 根据围绕这些单元格的局部邻域计算“能量”函数Δ èΔË\Delta E 以取决于的概率(使用为参数),要么交换两个单元的状态,要么不执行任何操作。Ë- βΔ èË-βΔËe^{-\beta \Delta E}ββ\beta 无限重复上述步骤。 边界条件也有一些复杂性,但是我想这些对于并行化不会造成太大困难。 值得一提的是,我对这些系统的瞬态动力学感兴趣,而不仅仅是平衡状态,因此我需要具有与上述等效的动力学特性的东西,而不是仅仅具有相同平衡分布的东西。(因此,chequerboard算法的变化不是我想要的。) 并行化上述算法的主要困难是冲突。由于所有计算仅取决于晶格的局部区域,因此许多晶格位点可以并行更新,只要它们的邻域不重叠即可。问题是如何避免这种重叠。我可以想到几种方法,但是我不知道哪种方法最适合实施。这些如下: 使用CPU生成随机网格站点的列表并检查冲突。当网格站点的数量等于GPU处理器的数量时,或者如果检测到冲突,请将每组坐标发送到GPU单元以更新相应的网格站点。这将很容易实现,但可能不会大大提高速度,因为检查CPU上的冲突可能不会比对CPU进行整个更新便宜得多。 将网格划分为区域(每个GPU单元一个),并拥有一个GPU单元负责随机选择和更新其区域内的网格单元。但是这个想法有很多我不知道如何解决的问题,最明显的是当一个单位选择一个与其区域边缘重叠的邻域时应该发生什么。 大致如下所示:让时间分步进行。将晶格分成不同的根据某个预定义方案在每个时间步上设置一组区域,并让每个GPU单元随机选择和更新一对邻域不与区域边界重叠的网格单元。由于边界每时每刻都在变化,因此只要区域相对较大,此约束就不​​会对动力学产生太大影响。这似乎易于实现并且可能很快,但是我不知道它对动态的近似程度,或者在每个时间步长上选择区域边界的最佳方案是什么。我发现了一些对“块同步细胞自动机”的引用,它们可能与这个想法相同或不同。(我不知道,因为似乎该方法的所有描述要么都是俄语的,要么是我无法访问的资源。) 我的具体问题如下: 以上任何算法是否是处理异步CA模型的GPU并行化的明智方法? 有没有更好的办法? 是否存在针对此类问题的现有库代码? 在哪里可以找到“块同步”方法的清晰英语描述? 进展 我相信我已经想出了一种可能合适的并行化异步CA的方法。下面概述的算法适用于一次仅更新一个单元的普通异步CA,而不是像我的那样更新相邻的一对单元。将其推广到我的具体情况有一些问题,但是我认为我有一个解决方案的想法。但是,由于下面讨论的原因,我不确定它将带来多少速度优势。 这个想法是用等效的随机同步CA(SCA)代替异步CA(以下称为ACA)。为此,我们首先想到ACA是一个泊松过程。即,时间连续进行,并且每个单元以每单位时间执行其更新功能的恒定概率独立于其他单元。 我们构造了一个SCA,该SCA的每个单元均存储两件事:该单元的状态 (即,在顺序实现中将存储在每个单元中的数据),以及一个浮点数代表(连续)时,在其将在下一次更新。此连续时间不对应于SCA的更新步骤。我将后者称为“逻辑时间”。时间值根据指数分布随机初始化:。(其中是一个可以任意选择其值的参数。)X我ĴX一世ĴX_{ij}Ť我ĴŤ一世Ĵt_{ij}Ť我Ĵ(0 )〜精通(λ )Ť一世Ĵ(0)〜经验值⁡(λ)t_{ij}(0) \sim \operatorname{Exp}(\lambda)λλ\lambda 在每个逻辑时间步,SCA的单元将更新如下: 如果对于附近的任何,时间,则不执行任何操作。ķ ,升ķ,升k, l我,Ĵ一世,Ĵi,jŤķ 升&lt; 吨我ĴŤķ升&lt;Ť一世Ĵt_{kl}<t_{ij} 否则,(1)使用与原始ACA相同的规则,根据相邻小区的状态更新状态;(2)生成一个随机值并将更新为。X我ĴX一世ĴX_{ij}Xķ 升Xķ升X_{kl}Δ 吨〜精通(λ )ΔŤ〜经验值⁡(λ)\Delta t \sim \operatorname{Exp}(\lambda)Ť我ĴŤ一世Ĵt_{ij}Ť我Ĵ+ Δ 吨Ť一世Ĵ+ΔŤt_{ij}+\Delta t …

2
当解的雅可比阶数为奇数时的牛顿法策略
我正在尝试为变量和x 2(所有其他都是常数)求解以下方程组:P,x1P,x1P,x_1x2x2x_2 A(1−P)2−k1x1=0AP2−k2x2=0(1−P)(r1+x1)4L1−P(r1+x2)4L2=0A(1−P)2−k1x1=0AP2−k2x2=0(1−P)(r1+x1)4L1−P(r1+x2)4L2=0\frac{A(1-P)}{2}-k_1x_1=0 \\ \frac{AP}{2}-k_2x_2=0 \\ \frac{(1-P)(r_1+x_1)^4}{L_1}-\frac{P(r_1+x_2)^4}{L_2}=0 我可以看到,通过分别针对x 1和x 2求解方程1和2 并将其代入方程3 ,可以将该方程组变成单个变量的单个方程。使用matlab的命令找到解决方案。使用参数k 1 = k 2 = 1,r 1 = r 2 = 0.2和A = 2,我发现真正的解是P = x 1 = x(P)(P)(P)x1x1x_1x2x2x_2fzerok1=k2=1k1=k2=1k_1=k_2=1r1=r2=0.2r1=r2=0.2r_1=r_2=0.2A=2A=2A=2。P=x1=x2=0.5P=x1=x2=0.5P=x_1=x_2=0.5 但是,当我将牛顿法应用于原始的3变量-3方程组时,无论我从多接近真实的解,迭代都不会收敛到解。)= (0.5 ,0.5 ,0.5 )。 x∗=(P∗,x∗1,x∗2)=(0.5,0.5,0.5)x∗=(P∗,x1∗,x2∗)=(0.5,0.5,0.5)x^*=(P^*,x_1^*,x_2^*)=(0.5,0.5,0.5) 起初,我怀疑我在牛顿方法的实现中存在错误。经过几次检查,我没有发现错误。然后我尝试使用初始猜测,lo&瞧:雅可比行列是奇异的。我知道奇异的jacobian可以减少收敛的顺序,但是我认为它不一定会阻止收敛到真正的解决方案。 x0=x∗x0=x∗x_0=x^* 因此,我的问题是,鉴于系统在真正的解决方案中的雅可比是单数的: 要证明牛顿法不会收敛到根,还需要其他什么条件? 全球化策略(例如线搜索)是否可以确保融合,尽管雅各布奇异?

2
非结构化以单元为中心的FVM CFD代码有哪些良好的数据类型?
我对有关在非结构化基于单元格的有限体积CFD中进行单元格浏览的有效数据结构的建议感兴趣。 我遇到的一个示例(在dolfyn cfd代码中)如下(我将显示相关段) 因此,我们有一个NFaces数组,用于存储每个单元格的面数。然后,CFace数组将本地到单元的面部编号映射到全局面部编号。\begin{listing}do ip=1,Ncel ... do j=1,NFaces(ip) k = CFace(ip,j) ipp = Face(k)%cell1 inn = Face(k)%cell2 if( inn &gt; 0 )then ! internal\end{listing}\begin{listing}do ip=1,Ncel ... do j=1,NFaces(ip) k = CFace(ip,j) ipp = Face(k)%cell1 inn = Face(k)%cell2 if( inn &gt; 0 )then ! internal\end{listing}\begin{listing} do ip=1,Ncel ... do j=1,NFaces(ip) k …

1
用于漂移扩散的PDE求解器和相关模型
我正在尝试为教学目的模拟基本的半导体模型-从漂移扩散模型开始。尽管我不想使用现成的半导体仿真器-我将学习其他(常见,最近或模糊的)模型,但我确实想使用现成的PDE求解器。 但是,即使对于简单的一维情况,漂移扩散模型也由许多耦合的非线性PDE组成: 电流密度方程 Ĵ p = q p (X )μ p È (X )+ q d p ∇ pĴñ= qn (x )μñË(x )+ qdñ∇ ñJn=qn(x)μnE(x)+qDn∇nJ_n = q n(x) \mu_n E(x) + qD_n \nabla n Ĵp= qp (x )μpË(x )+ qdp∇ pJp=qp(x)μpE(x)+qDp∇pJ_p = q p(x) \mu_p E(x) + qD_p \nabla p …
12 pde 

2
数值积分-处理NaN(C / Fortran)
我正在处理一个棘手的积分,该积分会在接近零的某些值处显示NaN,而现在我正在使用ISNAN语句对它们进行粗略的处理,该语句将发生这种情况时将被积数设置为零。我已经在FORTRAN中的NMS库(q1da例程-q1dax没什么不同)和C语言中的GSL库(使用QAGS例程)中进行了尝试。 我研究了CQUAD(C的GSL库的一部分),该CQUAD是专门为处理被集成物中的NaN和INF而设计的,但是参考文献中的有用信息很少,而且没有网上示例程序。有谁知道其他适用于C或FORTRAN的数字积分例程可以完成这项工作?
12 quadrature 

1
大稀疏整数矩阵的算法
我正在寻找一个对大型稀疏矩阵执行矩阵运算而又不牺牲数值稳定性的库。矩阵将是1000+×1000+,矩阵的值将在0到1000之间。我将执行索引演算算法,因此将串行生成(稀疏)矩阵的行向量。在开发每一行时,我将需要测试线性独立性。一旦我用所需数量的线性独立向量填充矩阵,便需要将矩阵转换为简化的行梯形形式。 现在的问题是,我的实现使用高斯消去法来确定线性独立性(一旦找到所有行向量,就确保行梯形形式)。但是,给定矩阵的密度和大小,这意味着每个新行中的条目随时间呈指数增长,因为必须找到前导条目的1cm才能执行抵消。寻找矩阵的简化形式进一步加剧了该问题。 所以我的问题是,是否有一种算法或更好的一种实现可以测试线性独立性并解决缩小的行梯形形式,同时保持条目尽可能小?线性独立性的有效测试尤为重要,因为在索引演算算法中,它最多执行。

4
任意精度可伸缩绳索仿真
我正在尝试模拟绳索对象。我了解的公式是由弹簧连接的一系列粒子。这些弹簧具有非常大的k值,因此线会变形,但拉伸很少。我得出的结论是,在闭合形式中不可能解决作为时间函数的问题,因为绳索是钟摆(不是闭合形式)的推广。 然后解决近似解决方案。我需要一个可扩展的算法。我看到的示例使用显式或隐式欧拉积分来移动粒子。这不会扩展。 要看到这一点,请考虑具有n个节点的绳索。向一端施加很大的力。由于绳索的拉伸不应太大,因此另一端的加速度必须是立即的。 但是,通过欧拉融合,将任何力量施加到另一端都需要n步。我注意到一个指数下降:如果第一个节点加速一定量,则相邻节点的加速较小(如果它们以相同的速度加速,则该算法不稳定)。因此,相邻节点是节点加速更慢! 因此,对于n个节点而言,加速度几乎可以忽略不计。这导致绳索明显伸展。如果只想使模拟的分辨率加倍,则突然需要采取小几十或几百倍的时间步才能获得类似的行为。 我正在寻找一种解决此问题的简单方法-即,高分辨率模拟仅需多项式时间额外的计算即可收敛到该解决方案。可以使用矩阵和线性代数技术的完整库。我对经典力学的知识非常好,而且我知道一些数值分析。
12 simulation 

1
如何在3D 4节点元素上集成多项式表达式?
我想在3D的4节点元素上集成多项式表达式。关于FEA的几本书介绍了在任意平坦的4位元素上执行积分的情况。在这种情况下,通常的过程是找到Jacobi矩阵,并使用其行列式将积分基础更改为归一化的矩阵,在该规范中,我的积分极限更简单[-1; 1],并且易于使用高斯-勒根德勒正交技术。 换句话说, 被简化为∫Sf(x,y) dxdy∫Sf(x,y) dxdy\displaystyle\int_S f(x,y)\ \mathrm{d}x\,\mathrm{d}y\,∫−11∫−11f~(e,n) |det(J)|dedn∫1−1∫1−1f~(e,n) |det(J)|dedn\displaystyle\int^{-1}_{1}\int^{-1}_{1} \tilde{f}(e,n)\ \left|\det(J)\right|\,\mathrm{d}e\,\mathrm{d}n 但是在2D情况下,我将平面任意元素更改为平面1但形状良好的正方形2乘以2。 3D 4节点元素通常并不平坦,但我想它仍然可以使用2D坐标系进行映射,而2D坐标系与笛卡尔坐标系有关。我无法弄清楚如何用{e,n}来表达{x,y,z}以及在这种情况下Jacobi矩阵的大小是多少(应该是正方形的)。

1
了解Wolfe条件以进行不精确的线搜索
根据Nocedal&Wright的《数值优化》一书(2006),对于下降方向,沃尔夫不精确的线搜索条件是,ppp 足以减少: 曲率条件:∇ ˚F (X + α p )Ť p ≥ Ç 2 ∇ ˚F (X )Ť p 对于0 &lt; c 1 &lt; c 2 &lt; 1f(x+αp)≤f(x)+c1αk∇f(x)Tpf(x+αp)≤f(x)+c1αk∇f(x)Tpf(x+\alpha p)\le f(x)+c_1\alpha_k\nabla f(x)^T p∇f(x+αp)Tp≥c2∇f(x)Tp∇f(x+αp)Tp≥c2∇f(x)Tp\nabla f(x+\alpha p)^Tp\ge c_2 \nabla f(x)^T p0&lt;c1&lt;c2&lt;10&lt;c1&lt;c2&lt;10<c_1<c_2<1 我可以看到如何充分下降条件规定,在新的点的函数值必须切下的X。但是我不确定曲率条件在几何上告诉我什么。另外,为什么必须施加c 1 &lt; c 2的关系?从几何学上讲,这是做什么的?x+αpx+αpx+\alpha pxxxc1&lt;c2c1&lt;c2c_1<c_2

3
数值稳定性的启发式检查
假设我有一个实值函数,其中有一些变量x i,我想对其进行数值计算。通常,f的公式可以包含乘积,有理数,超越函数等,并且需要很长时间才能通过分析研究其数值稳定性。否则在实践中至少会很费时间。假设我没有比以前更短的保证稳定性。有没有方法可以分析f的数值稳定性f(x1,…,xN)f(x1,…,xN)f(x_1,\ldots ,x_N)xixix_iffffff。我想将其与使用计算机代数系统获得的任意精确结果进行比较。假设该函数将使用stdlib函数和单精度或双精度在C中实现。我应该比较哪些数量来量化有限精度下的近似质量?如何确定变量的临界值?如何选择编译器和编译器优化,以便其他人可以轻松重现结果?...我知道问题的解决方法可能是通用的,可以给出很好的答案。但是我仍然认为这是计算机科学中的普遍问题,并且想知道是否有参考文献提出了进行此类分析的标准。
12 stability 

1
ODE线性系统的算法
我想知道:什么是最好的算法来解决 dudt=Aududt=Au\begin{equation} \frac{du}{dt} = Au \end{equation} 其中AAA是一个实n×nn×nn\times n矩阵。A与时间无关,通常是稀疏的,但不一定是带状的。其特征值具有非正实部。A也是对角线化的,但对于完全对角线化可能太大,以至于计算效率不足。 我有一个很好的经验,有一个隐含的梯形法则。 (I−Δt2A)un+1=(I+Δt2A)un(I−Δt2A)un+1=(I+Δt2A)un\begin{equation} \left(I-\frac{\Delta t}{2} A\right) u_{n+1} = \left(I+\frac{\Delta t}{2} A\right) u_{n} \end{equation} 显式方法或Pade近似值如何?此外,如果将强制性条款添加到RHS中,这会如何变化?

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.