gpt4 book ai didi

python - Numpy 与 mldivide ,"\"matlab 运算符

转载 作者:太空狗 更新时间:2023-10-29 21:36:47 29 4
gpt4 key购买 nike

A\B 在 matlab 中给出了一个特殊的解决方案,而 numpy.linalg.lstsq 没有。

A = [1 2 0; 0 4 3];
b = [8; 18];
c_mldivide = A \ b
c_mldivide =

0
4
0.66666666666667
c_lstsq = np.linalg.lstsq([[1 ,2, 0],[0, 4, 3]],[[8],[18]])
print c_lstsq
c_lstsq = (array([[ 0.91803279],
[ 3.54098361],
[ 1.27868852]]), array([], dtype=float64), 2, array([ 5.27316304,1.48113184]))
  1. matlab中mldivideA\B如何给出特解?
  2. 此解决方案是否有助于实现计算精度?
  3. 为什么这个解决方案很特别,您将如何在 numpy 中实现它?

最佳答案

对于像您这样的欠定系统(秩小于变量数),mldivide 返回一个包含尽可能多的零值的解。哪些变量将被设置为零取决于它的任意选择。

相比之下,lstsq 方法在这种情况下返回最小范数的解:也就是说,在无限的精确解族中,它会选择一个满足变量的最小平方和。

因此,Matlab 的“特殊”解决方案有点武断:可以将此问题中的三个变量中的任何一个设置为零。 NumPy给出的解其实比较特殊:有一个唯一的minimal-norm解

哪种解决方案更适合您的目的取决于您的目的。解决方案的非唯一性通常是重新考虑方程式方法的原因。但既然你问了,这里是生成 Matlab 类型解决方案的 NumPy 代码。

import numpy as np
from itertools import combinations
A = np.matrix([[1 ,2, 0],[0, 4, 3]])
b = np.matrix([[8],[18]])

num_vars = A.shape[1]
rank = np.linalg.matrix_rank(A)
if rank == num_vars:
sol = np.linalg.lstsq(A, b)[0] # not under-determined
else:
for nz in combinations(range(num_vars), rank): # the variables not set to zero
try:
sol = np.zeros((num_vars, 1))
sol[nz, :] = np.asarray(np.linalg.solve(A[:, nz], b))
print(sol)
except np.linalg.LinAlgError:
pass # picked bad variables, can't solve

对于您的示例,它输出三个“特殊”解决方案,其中最后一个是 Matlab 选择的。

[[-1. ]
[ 4.5]
[ 0. ]]

[[ 8.]
[ 0.]
[ 6.]]

[[ 0. ]
[ 4. ]
[ 0.66666667]]

关于python - Numpy 与 mldivide ,"\"matlab 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33559946/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com