def lanczos(les: LinearEquationSystem): assert les.n == les.m for row in range(les.n): for col in range(row + 1): if les.a[row][col] != les.a[col][row]: print('Алгоритм Ланцоша : определен только для симмтеричных матриц, ' 'см. индексы ({0},{1}) и ({1},{0})'.format(row + 1, col + 1)) return p = les.p ws = [M.column(les.b, 0)] vs = [None, M.mul_vec(les.a, ws[0], p)] ws.append(V.minus(vs[1], V.mul_scalar(ws[0], ratio(V.mul_sum(vs[1], vs[1], p), V.mul_sum(ws[0], vs[1], p), p), p), p)) for trial in range(max(MAX_TRIALS, les.n)): if V.mul_sum(ws[-1], M.mul_vec(les.a, ws[-1], p), p) == 0: if V.is_zero(ws[-1]): x = V.zero(les.n) for i in range(len(ws) - 1): bi = ratio(V.mul_sum(ws[i], ws[0], p), V.mul_sum(ws[i], vs[i + 1], p), p) x = V.add(x, V.mul_scalar(ws[i], bi, p), p) return x vs.append(M.mul_vec(les.a, ws[-1], p)) w1 = V.mul_scalar(ws[-1], ratio(V.mul_sum(vs[-1], vs[-1], p), V.mul_sum(ws[-1], vs[-1], p), p), p) w2 = V.mul_scalar(ws[-2], ratio(V.mul_sum(vs[-1], vs[-2], p), V.mul_sum(ws[-2], vs[-2], p), p), p) w_end = V.minus(V.minus(vs[-1], w1, p), w2, p) ws.append(w_end)
def solution(t): t.insert(s, dlam) # t[s:s] = dlam x = V.zero(n) for sol_i in range(n): x = V.add(x, V.mul_scalar(M.column(c, sol_i), t[sol_i], p), p) return x