为什么在尝试求解 16x16 方程组时 np.linalg.solve 会出现错误?

Why does np.linalg.solve give me an error when trying to solve a 16x16 system of equations?

我正在创建一个 nxn 矩阵,其最大值为 n**n。 np.linalg.solve 在 n < 16 时有效,但对于 n >= 16,它给出错误:

numpy.core._exceptions.UFuncTypeError: Cannot cast ufunc 'solve1' input 0 from dtype('O') to dtype('float64') with casting rule 'same_kind'

这是我的代码:

import numpy as np

def fib_to(n):
    if n==0: return [0]
    fibs = [0, 1]
    for i in range(2, n+1):
        fibs.append(fibs[-1] + fibs[-2])
    return fibs

def get_nth_matrix(n):
    coeficients = [[i**j for j in range(n, -1, -1)] for i in range(n+1)]
    augment = fib_to(n)
    return coeficients, augment

print(np.linalg.solve(*get_nth_matrix(16)))

我也注意到在矩阵上做np.linalg.cond也有同样的问题。它适用于最大 15 的值,但当 n 为 16 或更大时给出除以 0 的错误

get_nth_matrix(16) 返回的列表列表包含太大而无法放入 numpy 整数类型的整数。当您使用 np.linalg.solve() 时,这个列表列表会转换为一个 numpy 数组,但由于这个大小问题,它会生成一个 python 对象数组。发生错误是因为 np.linalg.solve() 无法处理这种类型的数组。您可以将 get_nth_matrix() 的最后一行替换为

return np.array(coeficients, dtype=float), augment

解决这个问题 - 至少对于不会溢出 float 类型的值。