Giải hệ phương trình 2 an trong Python

7/21/2015 7:12:00 PM

Phạm Kiên Bình · Phạm Kiên Bình 19:12 21/07/2015

Xin lỗi, tôi còn khá mới với giao hưởng và trăn nói chung.

Tôi muốn giải hệ phương trình tuyến tính không xác định sau:

x + y + z = 1 x + y + 2z = 3

35 hữu ích 3 bình luận 49k xem chia sẻ

answer

Tạ Xuân An · Tạ Xuân An 19:21 21/07/2015

SymPy gần đây đã có một trình giải hệ thống Linear mới: linsolvetrong sympy.solvers.solveset, bạn có thể sử dụng nó như sau:

In [38]: from sympy import * In [39]: from sympy.solvers.solveset import linsolve In [40]: x, y, z = symbols['x, y, z']

Danh sách các dạng phương trình:

In [41]: linsolve[[x + y + z - 1, x + y + 2*z - 3 ], [x, y, z]] Out[41]: {[-y - 1, y, 2]}

Dạng ma trận tăng cường:

In [59]: linsolve[Matrix[[[1, 1, 1, 1], [1, 1, 2, 3]]], [x, y, z]] Out[59]: {[-y - 1, y, 2]}

A * x = b Dạng

In [59]: M = Matrix[[[1, 1, 1, 1], [1, 1, 2, 3]]] In [60]: system = A, b = M[:, :-1], M[:, -1] In [61]: linsolve[system, x, y, z] Out[61]: {[-y - 1, y, 2]}

Lưu ý : Thứ tự của giải pháp tương ứng với thứ tự của các ký hiệu đã cho.

37 hữu ích 2 bình luận chia sẻ

answer

Phan Mai Châu · Phan Mai Châu 08:58 04/10/2016

Ngoài các câu trả lời tuyệt vời được đưa ra bởi @AMiT Kumar và @Scott, SymPy 1.0 còn bổ sung thêm các chức năng khác. Đối với hệ phương trình tuyến tính không xác định được, tôi đã thử dưới đây và làm cho nó hoạt động mà không cần đi sâu hơn sympy.solvers.solveset. Điều đó đang được nói, hãy đến đó nếu sự tò mò dẫn dắt bạn.

from sympy import * x, y, z = symbols['x, y, z'] eq1 = x + y + z eq2 = x + y + 2*z solve[[eq1-1, eq2-3], [x, y,z]]

Điều đó mang lại cho tôi {z: 2, x: -y - 1}. Một lần nữa, gói tuyệt vời, các nhà phát triển SymPy!

13 hữu ích 0 bình luận chia sẻ

answer

Nguyễn Danh Sơn · Nguyễn Danh Sơn 17:50 14/02/2019

import sympy as sp x, y, z = sp.symbols['x, y, z'] eq1 = sp.Eq[x + y + z, 1] # x + y + z = 1 eq2 = sp.Eq[x + y + 2 * z, 3] # x + y + 2z = 3 ans = sp.solve[[eq1, eq2], [x, y, z]]

điều này tương tự với câu trả lời @PaulDong với một số thay đổi nhỏ

  1. đó là một thực tiễn tốt để quen với việc không sử dụng import *[numpy có nhiều chức năng tương tự]
  2. xác định các phương trình với sp.Eq[]kết quả trong mã sạch hơn sau này

10 hữu ích 1 bình luận chia sẻ

answer

Lê Hữu Châu · Lê Hữu Châu 04:02 19/10/2016

Một ví dụ khác về hệ phương trình tuyến tính ma trận, giả sử chúng ta đang giải hệ này:

Trong SymPychúng tôi có thể làm điều gì đó như:

>>> import sympy as sy ... sy.init_printing[] >>> a, b, c, d = sy.symbols['a b c d'] ... A = sy.Matrix[[[a-b, b+c],[3*d + c, 2*a - 4*d]]] ... A ⎡ a - b b + c ⎤ ⎢ ⎥ ⎣c + 3⋅d 2⋅a - 4⋅d⎦ >>> B = sy.Matrix[[[8, 1],[7, 6]]] ... B ⎡8 1⎤ ⎢ ⎥ ⎣7 6⎦ >>> A - B ⎡ a - b - 8 b + c - 1 ⎤ ⎢ ⎥ ⎣c + 3⋅d - 7 2⋅a - 4⋅d - 6⎦ >>> sy.solve[A - B, [a, b, c, d]] {a: 5, b: -3, c: 4, d: 1}

4 hữu ích 0 bình luận chia sẻ

answer

Trần Minh Trang · Trần Minh Trang 19:35 21/07/2015

Bạn có thể giải ở dạng ma trận Ax=b[trong trường hợp này là một hệ thống chưa được xác định nhưng chúng ta có thể sử dụng solve_linear_system]:

from sympy import Matrix, solve_linear_system x, y, z = symbols['x, y, z'] A = Matrix[[ [1, 1, 1, 1], [1, 1, 2, 3] ]] solve_linear_system[A, x, y, z] {x: -y - 1, z: 2}

Hoặc viết lại dưới dạng [bản chỉnh sửa của tôi, không phải bản giao hưởng]:

[x]= [-1] [-1] [y]= y[1] + [0] [z]= [0] [2]

Trong trường hợp của một hình vuông, Achúng ta có thể xác định bvà sử dụng A.LUsolve[b].

2 hữu ích 0 bình luận chia sẻ

Xem nguồn: //stackoverflow.com/questions/31547657/how-can-i-solve-system-of-linear-equations-in-sympy

Định nghĩa phương trình bậc nhất 2 ẩn

Ở các lớp dưới chúng ta đã những phương pháp giải hệ phương trình trên như: Phương pháp thế, phương pháp đặt ẩn phụ…

Nhưng liệu trong C++ ta có dùng lại những phương pháp này được không ? Câu trả lời là có nhưng với mỗi phương pháp thì nó những ưu nhược điểm riêng. Ví dụ ta rút x ở hệ phương trên x = [ c1 -b1y ] / a1 

Nhưng nếu a1 bằng 0 thì sao ? Không lẻ bạn ngồi viết từng dòng if else để rút thế, nếu bạn làm như cũng được thôi nhưng chương trình của bạn sẽ phức tạp hơn rất nhiều. Vậy nên mình sẽ giới thiệu đến các bạn một phương pháp giải mới.

Giải hệ phương trình bậc nhất bằng phương pháp Cramer

Phương pháp Cramer

Các bạn có thể xem thêm phương pháp Cramer tại đây.

Từ đây ta chỉ cần tính các định thức D, Dx, Dy là xong rồi phải không nào.

  • Nếu định thức D = 0 thì phương trình hoặc vô nghiệm hoặc vô số nghiệm. Nếu Dx = Dy = 0 thì phương trình có vô số nghiệm. Ngược lại thì phương trình trên vô nghiệm.
  • Nếu định thức D ≠ 0 thì hệ phương trình trên luôn có nghiệm duy nhất với x = Dx/D và y = Dy/D.

Nào ta cùng bắt tay vào viết chương trình thôi !

Chương trình giải hệ phương trình bậc nhất 2 ẩn

Dưới đây là chương trình tham khảo cách giải hệ phương trình bậc nhất 2 ẩn, mình khuyên các bạn nên viết trước khi xem source.

Code C:

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

#include

int main[]{

    int a1, b1, c1, a2, b2, c2;

    float D, Dx, Dy, x, y;

    printf["a1*x + b1*y = c1\n"];

    printf["a2*x + b2*y = cc\n"];

    printf["\nNhap a1: "]; scanf["%d", &a1];

    printf["\nNhap b1: "]; scanf["%d", &b1];

    printf["\nNhap c1: "]; scanf["%d", &c1];

    printf["\nNhap a2: "]; scanf["%d", &a2];

    printf["\nNhap b2: "]; scanf["%d", &b2];

    printf["\nNhap c2: "]; scanf["%d", &c2];

    D = a1 * b2 - a2 * b1;

    Dx = c1 * b2 - c2 * b1;

    Dy = a1 * c2 - a2 * c1;

    if [D == 0] {

        if [Dx + Dy == 0]

            printf["He phuong trinh co vo so nghiem"];

        else

            printf["He phuong trinh vo nghiem"];

    }

    else {

        x = Dx / D;

        y = Dy / D;

        printf["He phuong trinh co nghiem [x, y] = [%d, %d]", x, y];

    }

    return 0;

}

Code C++:

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

#include

using namespace std;

int main[]{

    int a1, b1, c1, a2, b2, c2;

    float D, Dx, Dy, x, y;

    cout

Chủ Đề