使用numpy求解一个未知的线性系统



我正在尝试用程序解决一个非常简单的问题。

我有一个变量t,它必须同时满足以下两个方程:

x_v*t = (x_1 - x_2)
y_v*t = (y_1 - y_2)

我的第一反应是用右边的系数除以左边的系数来解决这个问题,但是这个系数不能保证为非0。

因此,我们总是可以使用RREF算法,并将系统表示为:

a | b
c | d

其中a=x_v,b=(x_1-x_2),c=y_v,d=(y_1-y_2)

找到RREF后,我们可以得到:

  • 0矩阵(系统是可解的)
  • 第一行有一个前导行,第二行是0(系统是可索的)
  • 任何一行都有一个前导0和一个非零尾数(系统不可解)

虽然我可以尝试自己编写上面的代码,但我想使用一个库,在那里我可以设置系统并询问api是否存在解决方案,所以我使用了numpy。

然而,目前我甚至不能设置一个非扩展矩阵不为平方的系统。

这是可以实现的吗?

这是可以实现的。您可以使用scipy库的函数fsolve。示例

import numpy as np
import scipy.optimize as so
def f(t, x_v, x_1, x_2, y_v, y_1, y_2):
return np.sum(np.abs([
x_v*t - (x_1 - x_2),
y_v*t - (y_1 - y_2),
]))

然后你会做

sol_object = so.fsolve(
func = f,                  # the function that returns the (scalar) 0 you want. 
x0   = 1,                  # The starting estimate
args = (1, 2, 3, 1, 2, 3), # Other arguments of f, i.e. x_v, x_1, x_2, y_v, y_1, y_2 
full_output = True
)
sol        = sol_object[0]
message    = sol_object[-1]
print(sol)
print(message)

输出

[-1.]
The solution converged.


正如jdhesa在评论中所提到的,这可以使用参数中的线性求解方法来完成。我在上面使用的先验适用于任何类型的变换。

另一种选择是只执行除法。如果两个"边"都为零,则结果将为NaN(0/0)。如果rhs,即(x_1-x_2)为非零,则结果将被输入

# c1 is np.array([x_1, y_1, z_1, ...])
# c2 is np.array([x_2, y_2, z_2, ...])
c = c1 - c2
# Use this to supress numpy warnings
with np.warnings.catch_warnings():
np.warnings.filterwarnings('ignore', 'invalid value encountered in true_divide')
np.warnings.filterwarnings('ignore','divide by zero encountered in true_divide')
t = c / v
non_nan_t = t[~np.isnan(t)]
if np.isinf(t).any():
print('unsolvable because rhs is nonzero but v is zero')
elif not np.allclose(non_nan_t, non_nan_t[0]):
print('no solution because equations disagree')
else:
print('solution:', non_nan_t[0])

相关内容

  • 没有找到相关文章

最新更新