计算科学

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

1
科学图书馆应如何报告错误?
在不同的软件工程学科中,有很多关于库应如何处理错误或其他特殊情况的哲学。我见过的一些: 返回一个错误代码,其结果由指针参数返回。这就是PETSc所做的。 通过哨兵值返回错误。例如,如果malloc无法分配内存,sqrt则返回NULL;如果传递负数,则将返回NaN,等等。此方法在许多libc函数中使用。 抛出异常。用于Deal.II,Trilinos等 返回变量类型;例如一个C + +函数,Result如果它运行正确并返回类型的对象,并使用类型Error描述其失败的方式将返回std::variant<Error, Result>。 使用断言和崩溃。用于p4est和igraph的某些部分。 每种方法的问题: 检查每个错误都会引入很多额外的代码。必须始终先声明将结果存储到的值,这会引入大量只能使用一次的临时变量。这种方法解释了发生了什么错误,但是很难确定为什么要进行深度调用堆栈,在哪里。 错误情况很容易忽略。最重要的是,如果整个输出类型范围都是合理的结果,那么许多函数甚至都没有有意义的前哨值。许多与#1相同的问题。 仅适用于C ++,Python等,不适用于C或Fortran。可以使用setjmp / longjmp巫术或libunwind在C中进行模仿。 仅在C ++,Rust,OCaml等中可用,而在C或Fortran中则不可用。可以使用宏魔术在C语言中模仿。 可以说是最有用的。但是,如果将这种方法用于一个C库,然后为该C库编写Python包装器,那么一个愚蠢的错误(例如将越界索引传递给数组)将使Python解释器崩溃。 互联网上有关错误处理的许多建议都是从操作系统,嵌入式开发或Web应用程序的角度编写的。崩溃是不可接受的,您必须担心安全性。科学应用程序几乎完全没有这些问题。 另一个要考虑的是什么类型的错误是可以恢复的。malloc失败是无法恢复的,并且在任何情况下,操作系统内存不足杀手都会先解决它。数组大小超出范围的索引也无法恢复。对于作为用户的我来说,库可以做的最好的事情就是崩溃,并显示一条信息丰富的错误消息。另一方面,可以通过使用直接因式分解求解器来解决迭代线性求解器收敛的失败。 科学图书馆应如何报告错误并期望对其进行处理? 我当然知道这取决于实现该库所使用的语言。但是据我所知,对于任何足够有用的库,人们都希望从某种语言(而不是其所使用的一种语言)来调用它。 顺便说一句,我认为如果C语言库将全局声明处理程序函数指针定义为公共API的一部分,则可以大大改善C语言库的方法#5。断言处理程序将默认报告文件/行号并崩溃。该库的C ++绑定将定义一个新的断言处理程序,该处理程序将引发C ++异常。同样,Python绑定将定义一个声明处理程序,该处理程序使用CPython API引发Python异常。但我不知道采用这种方法的任何示例。
11 software 


1
最小特征值无逆
假设甲∈ řn × n一种∈[Rñ×ñA\in\mathbb{R}^{n\times n}是对称正定矩阵。 一种一种A足够大,以至于直接求解昂贵甲X = b一种X=bAx=b。 是否有一种迭代算法来查找的最小特征值,而一种一种A该特征值在每次迭代中都不会反转一种一种A? 也就是说,我必须使用共轭梯度之类的迭代算法来求解,因此重复应用A - 1似乎是一个昂贵的“内部循环”。我只需要一个特征向量。甲X = b一种X=bAx=b一种− 1一种-1个A^{-1} 谢谢!

2
numpy中矩阵求逆的复杂性
我正在解决需要对稠密平方矩阵求逆的微分方程。这种矩阵求反消耗了我的大部分计算时间,所以我想知道我是否正在使用最快的算法。 我当前的选择是numpy.linalg.inv。从我的数字中,我看到它的缩放比例为,其中n是行数,因此该方法似乎是高斯消除法。Ø (ñ3)Ø(ñ3)O(n^3) 根据维基百科,有更快的算法可用。有谁知道是否有一个实现这些的库? 我想知道,为什么不用numpy使用这些更快的算法?

1
从实部数值恢复解析连续的虚部
我的情况。 我有一个通过复杂积分定义的复杂变量函数。我感兴趣的是此函数在虚轴上的值。我可以在以下功能区上对该函数进行数值访问:。形式上,积分表达式在该域之外是发散的,因此我需要解析继续。总结一下我的情况,ž = (X ,Ý )∈ (- ∞ ,∞ )× [ - 1 ,1 ]F(z)f(z)f(z)ž= (x ,y)∈ (- ∞ ,∞ )× [ - 1 ,1 ]z=(x,y)∈(−∞,∞)×[−1,1]z=(x,y)\in (-\infty,\infty)\times[-1,1] 这是我从数字上了解的功能区上的信息:F(z)f(z)f(z) 它同时围绕虚轴和实轴对称。 在处衰减为零。ř È (ž)→ ∞Re(z)→∞Re(z)\rightarrow\infty 它在附近爆炸。我不知道这可能是极点或分支点。我怀疑这种奇异性的性质(以及解析延续的所有其他孤立奇异性)取决于此函数的特定参数化(有关详细信息,请参见下面的积分)ξž= ± 我z=±iz=\pm iξξ\xi 实际上,绘制时它看起来与或非常相似。这是真实部分的图:1 /(1 + z 2 )2 n塞奇2(z)sech2(z)\text{sech}^2(z)1 /(1 + z2)2 n1/(1+z2)2n1/(1+z^2)^{2n} 我的问题是,鉴于我对该函数有大量的信息(在该功能区上对其进行总数值访问),我是否可以通过某种方式沿虚轴数值计算对该函数的近似值?我正在使用Mathematica。 我对虚轴上的值感兴趣的原因是,我需要评估此函数的以下傅立叶变换: …

1
线搜索和信任区域算法的尺度不变性
在Nocedal&Wright的有关数值优化的书中,第2.2节(第27页)中有一条语句:“一般而言,对于线搜索算法而言,保留比例不变性要比对信任区域算法要容易得多”。在同一部分中,他们讨论使用新变量,这些变量是原始变量的缩放版本,可以同时帮助行搜索和信任区域。另一种方法是预处理。对于信任区域方法,预处理等效于具有椭圆形信任区域,因此可提供尺度不变性。但是,对于行搜索的预处理,类似的直觉尚不清楚。线搜索以哪种方式更适合尺度不变性?有一些实际考虑吗? 另外,我对信任区域方法的预处理有疑问。对于病情严重的问题,好的预处理器会减少外部Newton迭代和内部CG迭代的次数,还是仅减少后者?由于信任区域在原始空间中为椭圆形,因此良好的预处理器应会导致椭圆形更好地匹配景观。我认为这可能会迫使算法朝更好的方向发展,从而减少外部牛顿迭代的次数。这是正确的吗?

2
科学计算中复杂算术的危险
复杂的内积具有由惯例决定两个不同的定义:ˉ Ù Ť v或ü Ť ˉ v。在BLAS中,我找到了例程cdotu,zdotu和cdotc,zdotc。前两个例程实际上计算u T v(伪内积!),而后两个例程将内积中的第一个向量共轭。另外,通过任一定义(共轭Ù或v),⟨ ü ,v ⟩ = ¯ ⟨ v ,ù ⟩⟨ ü ,v ⟩⟨u,v⟩\langle u,v\rangleü¯Ťvu¯Tv\bar{u}^TvüŤv¯uTv¯u^T\bar{v}üŤvuTvu^Tvüuuvvv⟨ ü ,v ⟩ = ⟨ v ,ù ⟩¯¯¯¯¯¯¯¯¯¯¯⟨u,v⟩=⟨v,u⟩¯\langle u,v\rangle=\overline{\langle v,u\rangle}与共轭!此外,正如评论中指出的那样,为多值复杂函数选择主要值可能取决于惯例。 我的问题是:这种复杂性是否会导致在科学计算中使用复杂算术的真正危险?Deal.ii的作者强调了这个问题,他们建议始终将复数分为实数部分和虚数部分,并且仅使用实数算法。但是我从来没有发现拆分方法很方便。例如,考虑时谐麦克斯韦方程的PML。 在大多数开源FEM软件中,除FreeFem ++和libmesh之外,似乎都普遍担心使用复数。但是,即使有两个例外,复杂算法的测试也比实数少。 我的最后一个问题是:我们是否应该始终避免使用复数?

1
将Runge-Kutta方法应用于二阶ODE
如何用Runge-Kutta第四阶代替Euler方法来确定自由落体运动的重力大小不是恒定的(例如,从地面10000 km处自由落体)? 到目前为止,我通过欧拉方法编写了简单的积分: while() { v += getMagnitude(x) * dt; x += v * dt; time += dt; } x变量表示当前位置,v表示速度,getMagnitude(x)返回x位置的加速度。 我尝试实现RK4: while() { v += rk4(x, dt) * dt; // rk4() instead of getMagintude() x += v * dt; time += dt; } rk4()函数体在哪里: inline double rk4(double tx, double tdt) …

3
高振荡积分的数值评估
在这一高级课程中,复杂函数理论在一次练习中的应用是高度振荡的 一世(λ )= ∫∞- ∞cos(λ COSx )罪XXdX一世(λ)=∫-∞∞cos⁡(λcos⁡X)罪⁡XXdXI(\lambda)=\int_{-\infty}^{\infty} \cos (\lambda \cos x) \frac{\sin x}{x} d x 对于大的λλ\lambda值,必须使用鞍点法在复平面中进行近似。 由于其高度振荡的性质,使用大多数其他方法很难评估该积分。这是λ = 10λ=10\lambda = 10时不同比例的积分图的两个片段: 前导渐近逼近为 一世1个(λ )= cos( λ - 14π)2个πλ---√一世1个(λ)=cos⁡(λ-1个4π)2πλI_{1}(\lambda) = \cos \left(\lambda-\frac{1}{4} \pi\right) \sqrt{\frac{2 \pi}{\lambda}} 进一步(小得多)的改进增加了术语 一世2(λ )= 18罪( λ - 14π)2个πλ3---√一世2(λ)=1个8罪⁡(λ-1个4π)2πλ3I_2(\lambda)=\frac{1}{8} \sin \left(\lambda-\frac{1}{4} \pi\right) \sqrt{\frac{2 \pi}{\lambda^{3}}} 近似值与λλ\lambda如下: 现在是我的问题:为了直观地看到近似值,我想将其与积分的“实际值”进行比较,或更准确地说,是使用独立算法将其与相同积分的近似值进行比较。由于次要修正的规模很小,我希望这确实很接近。 我尝试使用其他算法评估某些λλ\lambda的积分,但收效甚微:使用默认数值积分器的Mathematica和Matlab未能产生有意义的值(并明确报告此值),而mpmath则同时使用了双指数谭(sinh )谭⁡(辛)\tanh(\sinh)替换和Gauss-Legendre方法产生非常嘈杂的结果,尽管它确实有轻微的趋势围绕鞍点方法给出的值振荡,如下图所示: …

3
流形上的有限元
我想解决流形上的一些PDE,例如说球体上的椭圆方程。 我从哪说起呢?我想找到一些在2d中使用预先存在的代码/库的东西,暂时没有那么花哨的东西 稍后添加:欢迎文章和报告。

3
解决高维抛物线形偏微分方程(多电子薛定ding方程)的最新技术
用简单极点(形式为)在复杂域中求解高维(3-10)抛物型PDE的最新技术水平是什么)并吸收边界条件?1|r⃗ 1−r⃗ 2|1|r→1−r→2| \frac{1}{|\vec{r}_1 - \vec{r}_2|} 具体来说,我对求解多电子Schrödinger方程感兴趣: (∑i∑j≠i[−∇2i2m−ZiZj|r⃗ i−r⃗ j|+V(r⃗ i,t)])ψ=−i∂tψ(∑i∑j≠i[−∇i22m−ZiZj|r→i−r→j|+V(r→i,t)])ψ=−i∂tψ \left( \sum_i \sum_{j\neq i}\left[ -\frac{\nabla_i^2}{2 m} - \frac{Z_i Z_j}{|\vec{r}_i - \vec{r}_j|} + V(\vec{r}_i, t) \right]\right)\psi = -i\partial_t \psi 对于具有1个以上电子的双原子分子。

1
学术界有关代码发布和开源开发的政策
介绍 首先,让我陈述一些关于此事的矛盾断言,以说明问题所在。 我个人希望在开发的每个阶段都开放我的代码,因为 其他人将看到并利用我在做什么 我也喜欢重用现有代码 第三方可以贡献 公众在资助我,所以公众有权看到 但是我老板说 他需要批准以他的名字(或研究所的名字)公开的事物,并且他不能批准每一步 有有关机构知识产权的指导方针 和我的同事说 其他人会来偷我未发表的想法 我的实验代码对其他人没有多大用处 问题 为了在我的实验室中提出代码发布和开源开发的蓝图,我们想提出以下问题。 已经有这样一个指南,涵盖学术界开放软件的重要问题吗? 此类指南必须包含哪些问题? 您认为实施和使用该指南的正确方法是什么? 备注 信用,可复制性,代码文档以及发布位置等问题,我们希望在单独的指南中解决。

2
测试矩阵是否为正半定数
我有一个对称矩阵列表LL{\cal L},我需要检查它的正半定性(即它们的特征值非负)。 上面的评论暗示可以通过计算各自的特征值并检查它们是否为非负值来做到这一点(也许必须注意舍入误差)。 在我的场景中,计算特征值非常昂贵,但是我注意到我正在使用的库对正定性进行了相当快速的测试(也就是说,如果矩阵的特征值严格为正。) 因此,想法是,给定一个矩阵B∈LB∈LB \in {\cal L},一个测试如果B+ϵIB+ϵIB + \epsilon I是正定的。如果不是,则BBB不是正半定值,否则可以计算的特征值BBB以确保它确实是正半定值。 我的问题是: 如果给出了对正定性的有效检验,是否存在更直接有效的方法来测试矩阵是否为正半定性?

2
是否存在用于无矩阵方法的黑盒预处理器?
一般而言,Jacob-free牛顿-克雷洛夫(JFNK)方法和克雷洛夫方法非常有用,因为它们不需要显式存储或构造矩阵,而只需要矩阵向量乘积的结果即可。如果您确实形成了稀疏系统,那么这里有许多预处理器。 真正的无矩阵方法有哪些可用?谷歌搜索出现了一些对“矩阵估计”的引用,还有一些其他的事情表明它是可能的。这些方法通常如何起作用?它们与传统预处理器相比如何?基于物理学的无矩阵预处理器是路要走吗?有没有公​​开可用的方法,例如PETSc或其他软件包?

1
纯旋转最小二乘法
任何人都可以推荐以下最小二乘问题的方法: 最小化的中找到,其中R是单一的(旋转)矩阵。[R ∈ [R3 × 3R∈R3×3R \in \mathbb{R}^{3 \times 3}R∑我= 0ñ(R x一世− b一世)2→ 分钟∑i=0N(Rxi−bi)2→min\sum\limits_{i=0}^N (Rx_i - b_i)^2 \rightarrow \min[RRR 我可以通过最小化∑我= 0ñ(A x一世− b一世)2→ 分钟∑i=0N(Axi−bi)2→min\sum\limits_{i=0}^N (Ax_i - b_i)^2 \rightarrow \min(任意甲∈ ř3 × 3A∈R3×3A \in \mathbb{R}^{3 \times 3})来得到一个近似解矩阵一种AA和: 计算SVD:A = UΣ VŤA=UΣVTA = U \Sigma V^T,降低ΣΣ\Sigma并近似ř ≈ ùVŤR≈UVTR \approx U V^T 计算极坐标分解:A …

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.