Questions tagged «scipy»

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在这种情况下有效?

1
具有牛顿法的有限差分的近似雅可比方程会引起不稳定性吗?
我已经在python 3中实现了向后欧拉求解器(使用numpy)。为了我自己的方便和练习,我还编写了一个小函数来计算梯度的有限差分近似值,这样我就不必总是解析地确定雅可比矩阵(如果可能的话!)。 使用Ascher和Petzold 1998中提供的描述,我编写了此函数来确定给定点x处的梯度: def jacobian(f,x,d=4): '''computes the gradient (Jacobian) at a point for a multivariate function. f: function for which the gradient is to be computed x: position vector of the point for which the gradient is to be computed d: parameter to determine perturbation value eps, where eps …

2
在python中计算非常大且稀疏的邻接矩阵的所有特征值的最快方法是什么?
我试图找出一种比使用scipy.sparse.linalg.eigsh更快的方法来计算非常大且稀疏的邻接矩阵的所有特征值和特征向量,据我所知,此方法仅使用稀疏性和矩阵的对称属性。邻接矩阵也是二进制的,这使我认为有一种更快的方法可以实现。 我创建了一个随机的1000x1000稀疏邻接矩阵,并在x230 ubuntu 13.04笔记本电脑上比较了几种方法: scipy.sparse.linalg.eigs:0.65秒 scipy.sparse.linalg.eigsh:0.44秒 scipy.linalg.eig:6.09秒 scipy.linalg.eigh:1.60秒 对于稀疏的eigs和eigsh,我将所需特征值和特征向量的数量k设置为矩阵的秩。 问题始于更大的矩阵-在9000x9000矩阵上,scipy.sparse.linalg.eigsh花了45分钟!

1
矩阵平衡算法
我一直在从头开始编写控制系统工具箱,而纯粹是在Python3中编写(无耻插件:)harold。从我过去的研究中,我总是care.m出于技术/无关的原因而抱怨Riccati求解器。 因此,我一直在编写自己的例程集。我找不到解决方法的一件事是获得一种高性能的平衡算法,至少与一样好balance.m。在提到它之前,xGEBALfamily在Scipy中公开,并且基本上可以从Scipy进行如下调用,假设您具有一个float类型的2D数组A: import scipy as sp gebal = sp.linalg.get_lapack_funcs(('gebal'),(A,)) # this picks up DGEBAL Ab, lo, hi, scaling , info = gebal(A, scale=1 , permute=1 , overwrite_a=0 ) 现在,如果我使用以下测试矩阵 array([[ 6. , 0. , 0. , 0. , 0.000002], [ 0. , 8. , 0. , 0. , 0. ], …
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.