Разрешение линейных уравнений с параметрами - PullRequest
0 голосов
/ 19 декабря 2018

Добрый вечер, я тоже новичок в python, но я бы хотел улучшить свои навыки, решая ежедневные проблемы.Сегодняшняя задача состоит в том, чтобы создать программу на Python, которая может вычислять линейное приложение, такое как:

50x1    - 15x2  - 25x3  + 48x4  =   22         
- 13x1  - 4x2   + 9x3   - 4x4   =   -25        
- 14x1  + 38x2  - 26x3  - 32x4  =   -8*u-38         
29x1    - 13x2  - 4x3   + 26x4  =   41

Обычно я могу решить это следующим образом:

import numpy as np
a = np.array([[50,-15,-25,48],[-13,-4,9,-4],[-14,38,26,-32],[29,-13,-4,26]])
b = np.array([22,-25,-8*u-38,41])

print(np.linalg.solve(a,b))

Это приведет к ошибке из-забуква "u" в массиве B, как я могу заставить его работать?Спасибо за любые предложения.

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

вы можете установить свое уравнение как функцию от вас, в простейшем случае:

a = np.array([[50,-15,-25,48],[-13,-4,9,-4],[-14,38,26,-32],[29,-13,-4,26]])

def solve(u):
    b = np.array([22,-25,-8*u-38,41])
    return np.linalg.solve(a,b)

Тот факт, что ваш u не в матрице означает, что система не имеет один, многоили нет решений для разных значений u.Вы можете видеть это, используя определитель (np.linalg.det(a)).

0 голосов
/ 19 декабря 2018

Вы не можете решить для 4 неизвестных только с 3 уравнениями.Мой единственный возможный совет - отбросить u.

Edit

. В общем, линейные решатели системы, такие как np.linalg.solve, обычно соответствуют одному и тому же жесткому соглашению: первое входное значение должно бытьматрица коэффициентов ваших x s, а второе входное значение должно быть вектором постоянных значений, которые представляют левую часть отдельных уравнений.Если ваша система не такая, вам придется сначала выполнить рефакторинг вручную, чтобы она соответствовала стандартному соглашению.В противном случае вам придется использовать более гибкую систему решения, такую ​​как solveset в Sympy .

Вот как решить вашу систему уравнений в терминах uиспользуя Sympy:

import sympy as sym

x_0,x_1,x_2,x_3 = sym.symbols('x_:4')
u = sym.symbols('u')

lhs = [
    50*x_0 - 15*x_1 - 25*x_2 + 48*x_3,
    -13*x_0 - 4*x_1 + 9*x_2 - 4*x_3,
    -14*x_0 + 38*x_1 + 26*x_2 - 32*x_3,
    29*x_0 - 13*x_1 - 4*x_2 + 26*x_3
]
rhs = [22,-25,-8*u-38,41]

eqs = [l - r for l,r in zip(lhs, rhs)]
sym.nonlinsolve(eqs, [*xs])

Вывод:

{((1572*u + 176197)/34925, -4*(2341*u + 37266)/34925, -204*(u + 1)/1397, -2*(722*u + 21677)/6985)}
...