So I was given a homework assignment that requires solving the coefficients of cubic splines. Now I clearly understand how to do the math on paper as well as with MatLab, I want to solve the problem with Python. Given an equation Ax = b where I know the values of A and b, I want to be able to solve for x with Python and I am having trouble finding a good resource to do such a thing.
Ex.
A = |1 0 0|
|1 4 1|
|0 0 1|
x = Unknown 3x1 matrix
b = |0 |
|24|
|0 |
Solve for x
In a general case, use solve
:
>>> import numpy as np
>>> from scipy.linalg import solve
>>>
>>> A = np.random.random((3, 3))
>>> b = np.random.random(3)
>>>
>>> x = solve(A, b)
>>> x
array([ 0.98323512, 0.0205734 , 0.06424613])
>>>
>>> np.dot(A, x) - b
array([ 0., 0., 0.])
If your problem is banded (which cubic splines it often are), then there's http://docs.scipy.org/doc/scipy/reference/generated/scipy.linalg.solve_banded.html
To comment on some of the comments to the question: better not use inv
for solving linear systems. numpy.lstsq
is a bit different, it's more useful for fitting.
As this is homework, you're really better off at least reading up on ways of solving tridiagonal linear systems.
Numpy is the main package for scientific computing in Python. If you are windows user then download it here: http://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy else follow these instructions: http://www.scipy.org/install.html.
import numpy
A = [[1,0,0],[1,4,1],[0,0,1]]
b = [0,24,0]
x = numpy.linalg.lstsq(A,b)
In addition to the code of Zhenya, you might also find it intuitive to use the np.dot function:
import numpy as np
A = [[1,0,0],
[1,1,1],
[6,7,0]]
b = [0,24,0]
# Now simply solve for x
x = np.dot(np.linalg.inv(A), b)
#np.linalg.inv(A) is simply the inverse of A, np.dot is the dot product
print x
Out[27]: array([ 0., 0., 24.])
来源:https://stackoverflow.com/questions/22163113/matrix-multiplication-solve-ax-b-solve-for-x