用 Python 求解联立方程
Solving simultaneous equations with Python
谁能告诉我python解方程的代码:
2w + x + 4y + 3z = 5
w - 2x + 3z = 3
3w + 2x - y + z = -1
4x - 5z = -3
我有以下代码,但它不起作用:
A2 = np.array([[2,1,4,3],[1,-2,3],[3,2,-1, 1],[4, -5]])
b2 = np.array([[5,3,-1, -3]]).T
print('A\n',A2)
print('b\n',b2)
v2 = np.linalg.solve(A2,b2)
print('v')
print(v2)
问题是你如何格式化方程式中缺失的变量,记住你应该使用 0 而不是什么都没有,否则数组(方程式)会被误解并为你提供错误的 answer/error:
这应该对你有用:
import numpy as np
A = [[2,1,4,3],[1,-2,0,3],[3,2,-1,1],[0,4,0,5]]
Y = [5,3,-1,3]
res = np.linalg.inv(A).dot(Y)
print(res)
输出:
[-0.15384615 -0.30769231 0.76923077 0.84615385]
另一种方法是使用 sympy,Python 的符号数学包:
from sympy import Eq, solve
from sympy.abc import w, x, y, z
sol = solve([ Eq(2*w + x + 4*y + 3*z, 5),
Eq(w - 2*x + 3*z, 3),
Eq(3*w + 2*x - y + z, -1),
Eq(4*x - 5*z, -3) ])
print(sol)
print({ s:sol[s].evalf() for s in sol })
这会打印:
{w: 94/45, x: -20/9, y: 74/45, z: -53/45}
{w: 2.08888888888889, x: -2.22222222222222, y: 1.64444444444444, z: -1.17777777777778}
甚至可以直接把字符串输入,求解决办法:
from sympy import Eq, solve
from sympy.parsing.sympy_parser import parse_expr, standard_transformations, implicit_multiplication_application
eqs = ['2w + x + 4y + 3z = 5',
'w - 2x + 3z = 3',
'3w + 2x - y + z = -1',
'4x - 5z = -3']
transformations=(standard_transformations + (implicit_multiplication_application,))
eqs_sympy = [Eq(parse_expr(e.split('=')[0], transformations=transformations),
parse_expr(e.split('=')[1], transformations=transformations))
for e in eqs]
sol = solve(eqs_sympy)
print(sol)
谁能告诉我python解方程的代码:
2w + x + 4y + 3z = 5
w - 2x + 3z = 3
3w + 2x - y + z = -1
4x - 5z = -3
我有以下代码,但它不起作用:
A2 = np.array([[2,1,4,3],[1,-2,3],[3,2,-1, 1],[4, -5]])
b2 = np.array([[5,3,-1, -3]]).T
print('A\n',A2)
print('b\n',b2)
v2 = np.linalg.solve(A2,b2)
print('v')
print(v2)
问题是你如何格式化方程式中缺失的变量,记住你应该使用 0 而不是什么都没有,否则数组(方程式)会被误解并为你提供错误的 answer/error:
这应该对你有用:
import numpy as np
A = [[2,1,4,3],[1,-2,0,3],[3,2,-1,1],[0,4,0,5]]
Y = [5,3,-1,3]
res = np.linalg.inv(A).dot(Y)
print(res)
输出:
[-0.15384615 -0.30769231 0.76923077 0.84615385]
另一种方法是使用 sympy,Python 的符号数学包:
from sympy import Eq, solve
from sympy.abc import w, x, y, z
sol = solve([ Eq(2*w + x + 4*y + 3*z, 5),
Eq(w - 2*x + 3*z, 3),
Eq(3*w + 2*x - y + z, -1),
Eq(4*x - 5*z, -3) ])
print(sol)
print({ s:sol[s].evalf() for s in sol })
这会打印:
{w: 94/45, x: -20/9, y: 74/45, z: -53/45}
{w: 2.08888888888889, x: -2.22222222222222, y: 1.64444444444444, z: -1.17777777777778}
甚至可以直接把字符串输入,求解决办法:
from sympy import Eq, solve
from sympy.parsing.sympy_parser import parse_expr, standard_transformations, implicit_multiplication_application
eqs = ['2w + x + 4y + 3z = 5',
'w - 2x + 3z = 3',
'3w + 2x - y + z = -1',
'4x - 5z = -3']
transformations=(standard_transformations + (implicit_multiplication_application,))
eqs_sympy = [Eq(parse_expr(e.split('=')[0], transformations=transformations),
parse_expr(e.split('=')[1], transformations=transformations))
for e in eqs]
sol = solve(eqs_sympy)
print(sol)