首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:求解矩阵方程Ax =b,其中A包含变量

Python:求解矩阵方程Ax =b,其中A包含变量
EN

Stack Overflow用户
提问于 2020-04-10 05:58:02
回答 5查看 998关注 0票数 2

我希望解一个形式为Ax =b的矩阵方程,其中

代码语言:javascript
复制
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版本。有没有一个预建的模块来处理这些类型的问题?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2020-04-10 18:26:45

正如你在评论中提到的,这个问题是过度约束的,因此没有确切的解决方案。

另一方面,直接使用np.linalg.lstsq的问题是在矩阵A中有一个变量。

一种可能的解决方法是确定变量a的范围,并根据它找到参数解决方案,我的意思是:

代码语言:javascript
复制
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

在此表单中,您可以通过绘制结果来查看变量bcd如何随a变化:

代码语言:javascript
复制
results.set_index('a').plot(figsize=(16,8))

请注意任何ab==c,因此您在图上看不到一条轨迹。

票数 1
EN

Stack Overflow用户

发布于 2020-04-10 06:34:41

以下是您要解的方程:

代码语言:javascript
复制
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⎦

我们可以使用伪逆得到最小二乘解:

代码语言:javascript
复制
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                          ⎦
票数 1
EN

Stack Overflow用户

发布于 2020-04-10 06:37:48

看起来你发布的问题有一个精确的分析解决方案:

代码语言:javascript
复制
ab = 0.4,
ac = 0.4,
ad = 0.2,
b + c = 0.1

将前两个方程式相加,并除以第四个方程式,结果为:

代码语言:javascript
复制
(1) + (2) => a(b+c) = 0.8
(4) b+c = 0.1

=> a=8

所以如果你知道向量b,你总是可以求解abacad,然后用第四个来求解a

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61130877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档