首页 > 解决方案 > 如何将多处理池用于多变量函数python

问题描述

我正在尝试使用库多处理来运行下一个代码:

import matplotlib.pyplot as plt
import numpy as np
from multiprocessing import Pool

def newtalt(fun,x0,err,mit):

    xnew = x0.copy()
    F, dF = fun(x0)

    r = F.copy()
    M = dF.copy()

    sigma = np.linalg.norm(r)

    for k in range(mit):

        if sigma < err:
            break

        d = np.linalg.solve(M, -r)
        xnew = xnew + d
        r, M = fun(xnew)
        sigma = np.linalg.norm(r)

    return xnew, k

def fun(x):

    f_r = x[0] ** 3 - 3 * x[0] * (x[1] ** 2) - 1
    f_i = 3 * (x[0]**2) * x[1] - (x[1] ** 3)
    f = np.array([f_r,f_i])

    df_rx = 3 * (x[0] ** 2) - 3 * (x[1] ** 2)
    df_ry = -6 * x[0] * x[1]
    df_ix = 6 * x[0] * x[1]
    df_iy = 3 * (x[0] ** 2) - 3 * (x[1] ** 2)
    df = np.array([[df_rx,df_ry],[df_ix,df_iy]])

    return f, df

if __name__=='__main__':
    pool = Pool(processes=10)

    err = 1e-5
    mit = 300
    N = 50

    x = np.linspace(-2.5, 2.5, N)
    y = np.linspace(-2.5, 2.5, N)
    A = np.zeros((N, N))
    B = np.zeros([N, N, 4], dtype=int)

    for i in range(N):
        for j in range(N):
            z = np.array([x[i], y[j]])

            xsol, it = pool.map(newtonalt,(fun,z,err,mit))
            pool.close()

            A[i,j] = it

    plt.imshow(A,cmap='Set1')
    plt.show()

显然它不起作用,因为我真的不知道如何正确使用多处理,而且当你使用的函数有多个参数时就更难了。我读到在 for 循环中使用 .pool() 不好,但无论如何,正如我所说,我真的迷失了这个库。

标签: pythonmultidimensional-arraypython-multiprocessingpool

解决方案


推荐阅读