小编rms*_*987的帖子

从python中的非线性方程组中寻找复杂的根

我一直在测试一种已在文献中发表的算法,该算法涉及在Matlab和Python中求解一组"m"非线性方程.这组非线性方程涉及包含复数的输入变量,因此得到的解也应该是复杂的.截至目前,我已经能够通过使用以下代码行在Matlab中获得相当不错的结果:

lambdas0 = ones(1,m)*1e-5;
options = optimset('Algorithm','levenberg-marquardt',...
'MaxFunEvals',1000000,'MaxIter',10000,'TolX',1e-20,...
'TolFun',1e-20);

Eq = @(lambda)maxentfun(lambda,m,h,g);
[lambdasf]  = fsolve(Eq,lambdas0,options);
Run Code Online (Sandbox Code Playgroud)

其中h和g分别是复数矩阵和向量.该解决方案非常适用于各种初始值.

我一直试图在Python中模仿这些结果,但却没有取得什么成功.数值求解器的设置似乎有很大不同,"levenburg-marquardt"算法存在于函数根之下.在python中,这个算法无法处理复杂的根,当我运行以下行时:

lambdas0 = np.ones(m)*1e-5

sol = root(maxentfun, lambdas0, args = (m,h,g), method='lm', tol = 1e-20, options = {'maxiter':10000, 'xtol':1e-20})

lambdasf = sol.x
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

minpack.error: Result from function call is not a proper array of floats.
Run Code Online (Sandbox Code Playgroud)

我已经尝试过使用其他一些算法,比如'broyden2'和'anderson',但它们远不如Matlab,只有在初始条件下玩之后才会给出好的结果.函数'fsolve'也不能处理复杂的变量.

我想知道是否有一些我正在应用的错误,如果有人知道如何正确解决Python中复杂的非线性方程式.

非常感谢你

python matlab nonlinear-functions complex-numbers numerical-methods

6
推荐指数
1
解决办法
2413
查看次数

比较python和matlab中的fsolve结果

我对几天前写的帖子有一个跟进问题,谢谢你以前的反馈:

从python中的非线性方程组中寻找复杂的根

我现在已经在python中设置了设置的非线性方程,因此fsolve将独立处理实部和虚部.但是,仍然存在python"fsolve"收敛到正确解决方案的问题.我有完全相同的输入在Matlab中使用,经过双重检查后,方程组也完全相同.无论我如何设置初始值,Matlab都将始终收敛到正确的解决方案.但是,对于python,每个初始条件都会产生不同的结果,而不是正确的结果.在几分之一秒后,python会出现以下警告:

/opt/local/Library/Frameworks/Python.framework/Versions/Current/lib/python2.7/site-packages/scipy/optimize/minpack.py:227: 
RuntimeWarning: The iteration is not making good progress, as measured by the 
improvement from the last ten iterations.
warnings.warn(msg, RuntimeWarning) 
Run Code Online (Sandbox Code Playgroud)

我想知道在python和Matlab中的fsolve之间是否存在一些已知的差异,以及是否有一些已知的方法来优化python中的性能.

非常感谢你

python matlab nonlinear-functions complex-numbers numerical-methods

4
推荐指数
1
解决办法
3293
查看次数

为运行多处理队列的 python 脚本激活了内存不足杀手?

由于不断收集数据,我编写了一个需要一次运行多天的python程序。以前我一次运行这个程序几个月都没有问题。我最近对该程序进行了一些更新,现在大约 12 个小时后,我得到了可怕的记忆杀手。'dmesg' 输出如下:

[9084334.914808] Out of memory: Kill process 2276 (python2.7) score 698 or sacrifice child
[9084334.914811] Killed process 2276 (python2.7) total-vm:13279000kB, anon-rss:4838164kB, file-rss:8kB
Run Code Online (Sandbox Code Playgroud)

除了一般的 Python 编码外,对程序所做的主要更改是添加了多处理队列。这是我第一次使用此功能,所以我不确定这是否可能是问题的原因。我的程序中队列的目的是能够在并行进程中进行动态更改。队列在主程序中启动,并在并行进程中不断被监视。我如何在并行过程中执行此操作的简化版本如下(“q”是队列):

while(1):

    if q.empty():
        None

    else:
        fr = q.get()
        # Additional code

    time.sleep(1)
Run Code Online (Sandbox Code Playgroud)

'q' 的动态更改不会经常发生,因此大部分时间 q.empty() 将是 true,但是一旦进行更改,循环就会准备就绪。我的问题是,一次运行此代码多个小时会导致内存最终耗尽吗?由于“while”循环非常短并且基本上不停地运行,我认为这可能是一个问题。如果这可能是问题的原因,是否有人对如何改进代码以便不调用内存不足杀手有任何建议?

非常感谢。

python queue out-of-memory multiprocessing kill-process

4
推荐指数
1
解决办法
9196
查看次数