示例#1
0
    def Omega(bAr, nu, Anu, index_classic_div, index_kahan_div, num_func):
        div = bAr[index_classic_div] / Anu[index_classic_div]
        pdiv = []

        for k in index_kahan_div:
            pdiv.append(kdiv(bAr[k], Anu[k], num_func[k]))

        result = intersection(div[0], (V * endint)[nu])
        for el in div[1:]:
            result = intersection(result, el)
        for el in pdiv:
            result = intersection(result, el)

        if 2 in num_func:
            if (float('-inf') == result._b).all():
                return float('inf')
            elif (float('-inf') == result._b).any():
                return np.max(result.a)
            else:
                return np.min(result.a)
        else:
            if float('-inf') in result._b:
                return float('inf')
            else:
                return result.a
示例#2
0
    def Omega(bAr, _nu, Anu, index_classic_div, index_kahan_div, num_func):
        try:
            div = bAr[index_classic_div] / Anu[index_classic_div]
        except:
            div = []
        pdiv = []

        for k in index_kahan_div:
            pdiv.append(kdiv(bAr[k], Anu[k], num_func[k]))

        try:
            result = intersection(div[0], V[_nu])
            for el in div[1:]:
                result = intersection(result, el)
        except:
            result = intersection(pdiv[0], V[_nu])

        for el in pdiv:
            result = intersection(result, el)

        if 2 in num_func:
            if np.isnan(result._b).all():
                return float('inf')
            elif np.isnan(result._b).any():
                return np.max(result.a)
            else:
                return np.min(result.a)
        else:
            if np.isnan(result._b):
                return float('inf')
            else:
                return result.a
示例#3
0
def HansenSengupta(func, J, x0, maxiter=10**3, tol=1e-12):
    def HS(X, c):
        L = asinterval(J(X))

        if L.shape == ():
            LAMBDA = 1 / L.mid
            A = LAMBDA * L
            b = -LAMBDA * func(c)

            if 0 in A:
                raise Exception('Диагональный элемент матрицы содержит нуль!')
            else:
                GS = b / A
            return c + GS

        else:
            LAMBDA = np.linalg.inv(L.mid)
            A = LAMBDA @ L
            b = -LAMBDA @ func(c)

            GS = Gauss_Seidel(A, b, X - c, tol=tol)
            return c + GS

    if not (0 in func(x0)):
        raise Exception('Брус не содержит решений!')

    result = x0
    pre_result = result.copy
    c = result.mid

    error = float('inf')
    nit = 0
    while nit < maxiter and error > tol:
        result = intersection(result, HS(result, c))
        if Interval(float('-inf'), float('-inf'), sortQ=False) in result:
            return result
        c = result.mid
        error = dist(result, pre_result)
        pre_result = result.copy
        nit += 1
    return result
示例#4
0
def Krawczyk(func, J, x0, maxiter=10**3, tol=1e-12):
    def K(X, c):
        L = asinterval(J(X))

        if L.shape == ():
            LAMBDA = 1 / L.mid

            B = 1 - LAMBDA * L
            return c - LAMBDA * asinterval(func(c)) + B * (X - c)

        else:
            n, m = L.shape
            LAMBDA = np.linalg.inv(L.mid)

            B = np.eye(n) - LAMBDA @ L
            w, _ = np.linalg.eigh(abs(B))
            return c - LAMBDA @ func(c) + B @ (X - c)

    if not (0 in func(x0)):
        raise Exception('Брус не содержит решений!')

    result = x0
    pre_result = result.copy
    c = result.mid

    error = float('inf')
    nit = 0
    while nit < maxiter and error > tol:
        result = intersection(result, K(result, c))
        if Interval(float('-inf'), float('-inf'), sortQ=False) in result:
            return result
        c = result.mid
        error = dist(result, pre_result)
        pre_result = result.copy
        nit += 1

    return result
示例#5
0
def Gauss_Seidel(A, b, x0=None, P=True, tol=1e-8, maxiter=10**3):
    """
    Итерационный метод Гаусса-Зейделя для решения ИСЛАУ.

    Parameters:
                A: Interval
                    Матрица ИСЛАУ.

                b: Interval
                    Вектор правой части ИСЛАУ.

    Optional Parameters:
                x0: Interval
                    Начальный брус, в котором ищется решение.

                P: Interval
                    Матрица предобуславливания.
                    В случае, если параметр не задан, то берётся обратное среднее.

                tol: float
                    Погрешность для остановки итерационного процесса.

                maxiter: int
                    Максимальное количество итераций.

    Returns:
                out: Interval
                    Возвращается интервальный вектор решений.
    """

    A = asinterval(A).copy
    b = asinterval(b).copy

    if A.shape == () or A.shape == (1, 1):
        if 0 in A:
            raise Exception('Диагональный элемент матрицы содержит нуль!')
        return b / A

    if P:
        P = np.linalg.inv(A.mid)
        A = P @ A
        b = P @ b

    n, _ = A.shape
    mignitude = diag(A).mig
    _abs_A = abs(A)
    for k in range(n):
        if mignitude[k] < sum(_abs_A[k]) - _abs_A[k, k]:
            raise Exception('Матрица А не является H матрицей!')

    error = float("inf")
    result = zeros(n)

    if x0 is None:
        pre_result = zeros(n) + Interval(-1000, 1000, sortQ=False)
    else:
        pre_result = x0.copy

    nit = 0
    while error >= tol and nit <= maxiter:
        for k in range(n):
            tmp = 0
            for l in range(n):
                if l != k:
                    tmp += A[k, l] * pre_result[l]
            result[k] = intersection(pre_result[k], (b[k] - tmp) / A[k, k])

            if float('-inf') in result[k]:
                raise Exception("Интервалы не пересекаются!")

        error = dist(result, pre_result)
        pre_result = result.copy
        nit += 1
    return result