我希望解一个形式为Ax =b的矩阵方程,其中
A = [[a,0,0],
[0,a,0],
[0,0,a],
[1,1,0],
[0,0,1]]
x = [b,c,d]
b = [0.4,0.4,0.2,0.1,0.05]如果我知道a的值,我会使用numpy.linalg.lstsq模块。类似地,如果我认为解决方案是精确的,我会使用渐近解算器。但是,解决方案需要对某些数据进行最小二乘拟合,并且渐近求解器通常告诉我没有解决方案。
基本上,我正在寻找的是一个允许我在A中声明一个或多个变量的numpy.linalg.lstsq版本。有没有一个预建的模块来处理这些类型的问题?
发布于 2020-04-10 18:26:45
正如你在评论中提到的,这个问题是过度约束的,因此没有确切的解决方案。
另一方面,直接使用np.linalg.lstsq的问题是在矩阵A中有一个变量。
一种可能的解决方法是确定变量a的范围,并根据它找到参数解决方案,我的意思是:
import numpy as np
import pandas as pd
# Define the list of results
R = []
b = np.array([0.4, 0.4, 0.2, 0.1, 0.5])
# Here I picked a (-10,10) range for a with a step of 0.01
for a in np.arange(-10, 10, 0.01):
# Define A given a
A = np.array([[a,0,0], [0,a,0], [0,0,a], [1,1,0], [0,0,1]])
# Solve with least-squares and store both a and the result
R.append((a, *np.linalg.lstsq(A,b)[0]))
# Convert solutions to a dataframe
results = pd.DataFrame(R, columns=list('abcd'))
results
a b c d
0 -10.00 -0.038235 -0.038235 -0.014851
1 -9.99 -0.038271 -0.038271 -0.014861
2 -9.98 -0.038307 -0.038307 -0.014871
3 -9.97 -0.038343 -0.038343 -0.014880
4 -9.96 -0.038379 -0.038379 -0.014890
... ... ... ...
1995 9.95 0.040395 0.040395 0.024899
1996 9.96 0.040355 0.040355 0.024870
1997 9.97 0.040315 0.040315 0.024840
1998 9.98 0.040275 0.040275 0.024811
1999 9.99 0.040236 0.040236 0.024782在此表单中,您可以通过绘制结果来查看变量b、c和d如何随a变化:
results.set_index('a').plot(figsize=(16,8))

请注意任何a的b==c,因此您在图上看不到一条轨迹。
发布于 2020-04-10 06:34:41
以下是您要解的方程:
In [39]: a, b, c, d = symbols('a, b, c, d', real=True)
In [40]: A = Matrix([[a,0,0],
...: [0,a,0],
...: [0,0,a],
...: [1,1,0]])
...: x = Matrix([[b],[c],[d]])
...: b = Matrix([[0.4],[0.4],[0.2],[0.1]])
In [41]: A*x - b
Out[41]:
⎡ a⋅b - 0.4 ⎤
⎢ ⎥
⎢ a⋅c - 0.4 ⎥
⎢ ⎥
⎢ a⋅d - 0.2 ⎥
⎢ ⎥
⎣b + c - 0.1⎦我们可以使用伪逆得到最小二乘解:
In [53]: A.pinv() * b
Out[53]:
⎡ ⎛ 2 ⎞ ⎛ 2 ⎞ ⎤
⎢0.4⋅a⋅⎝a + 1⎠ 0.4⋅a 0.1⋅⎝a + 1⎠ 0.1 ⎥
⎢────────────── - ───────── + ──────────── - ─────────⎥
⎢ 4 2 4 2 4 2 4 2⎥
⎢ a + 2⋅a a + 2⋅a a + 2⋅a a + 2⋅a ⎥
⎢ ⎥
⎢ ⎛ 2 ⎞ ⎛ 2 ⎞ ⎥
⎢0.4⋅a⋅⎝a + 1⎠ 0.4⋅a 0.1⋅⎝a + 1⎠ 0.1 ⎥
⎢────────────── - ───────── + ──────────── - ─────────⎥
⎢ 4 2 4 2 4 2 4 2⎥
⎢ a + 2⋅a a + 2⋅a a + 2⋅a a + 2⋅a ⎥
⎢ ⎥
⎢ 0.2 ⎥
⎢ ─── ⎥
⎣ a ⎦发布于 2020-04-10 06:37:48
看起来你发布的问题有一个精确的分析解决方案:
ab = 0.4,
ac = 0.4,
ad = 0.2,
b + c = 0.1将前两个方程式相加,并除以第四个方程式,结果为:
(1) + (2) => a(b+c) = 0.8
(4) b+c = 0.1
=> a=8所以如果你知道向量b,你总是可以求解ab,ac,ad,然后用第四个来求解a。
https://stackoverflow.com/questions/61130877
复制相似问题