2016-12-18 110 views
5
A + B = 8 
    B + D = 8 
    A + C = 13 
    C - D = 6 

Jak znaleźć wartości A, B, C i D?Jak rozwiązać tę zagadkę matematyczną z Pythonem?

Przypuszczałem wartości byłoby całkowite i dodatnie i zrobił to:

a = range(0,14) 
    b = c = d = a 
    for i in a: 
    for x in b: 
     for y in c: 
     for z in d: 
      if (a[i] + b[x] == 8 and a[i] + c[y] == 13 and b[x] + d[z] == 8 and c[y]-d[z]==6): 
      print(a[i],b[x],c[y],d[z]) 

Ale to nie działa. Nawet wtedy rozszerzam zasięg do a = range(-100,100). Po ręcznym rozwiązaniu równania (przy pomocy Google) wiem, że są zaangażowane pływaki, np. A = 3.5 itd.

Ale jak rozwiązać ten problem za pomocą Pythona.

+1

Gdy wykonujesz 'i in list',' i' pobiera elementy listy, a nie indeksy. Nie musisz wykonywać 'a [i]', wystarczy użyć 'i'. – Barmar

+1

Jeśli wyniki mogą być wyświetlane jako pływające, nie można tego zrobić z wyszukiwaniem, ponieważ do wyszukiwania jest praktycznie nieskończona liczba. Aby rozwiązać problem, musisz użyć logiki. – Barmar

+2

Na przykład, 'A + B = 8' i' B + D = 8' oznacza, że ​​'A == D' – Barmar

Odpowiedz

6

Nie trzeba uczyć się teorii macierzy (przynajmniej nie w tym przypadku).

>>> from sympy import * 
>>> var('A B C D') 
(A, B, C, D) 
>>> solve([A+B-8,B+D-8,A+C-13,C-D-6]) 
{B: 9/2, D: 7/2, C: 19/2, A: 7/2} 

Wystarczy wyrażania każdego wzoru tak, że A + B = 8 w postaci A i B, 8 = 0, a następnie pominięto '= 0' część.

+0

Szczerze mówiąc, jest to odpowiedź, na którą miałem nadzieję, ponieważ to właśnie jestem "tylko użytkownikiem", a nie programistą uwielbiającym Pythona - nie muszę wymyślać koła! Prawie każdy problem wydaje się być biblioteką, która rozwiązuje problem. Chcę zaznaczyć tę odpowiedź jako akceptowalną, ponieważ takie podejście jest tak intuicyjne nawet dla początkujących i nie wymaga znajomości matryc ani doskonałości w matematyce (chociaż matryce oczywiście wyglądają świetnie i imponują!). Dziękuję Bill! –

+0

Proszę bardzo, Tset. Teraz chciałbym móc twierdzić, że jakakolwiek część sympy była moją własną pracą. Ale sam jestem tylko użytkownikiem. –

8

Jeśli wiesz, algebry liniowej, można oprawić pytanie jako układ równań, który jest następnie trywialny rozwiązać za pomocą swobodnie dostępne i popularne biblioteki o nazwie numpy (tip kapelusz @Griboullis):

import numpy as np 

A = [[1, 1, 0, 0], 
    [0, 1, 0, 1], 
    [1, 0, 1, 0], 
    [0, 0, 1, -1]] 
b = [8, 8, 13, 6] 
answer = np.linalg.solve(A, b) 

Jeśli chcesz odświeżać w matematyce matematycznej/algebrze liniowej za rozwiązaniem tego python, możesz sprawdzić https://www.mathsisfun.com/algebra/systems-linear-equations-matrices.html.

+1

Święty s *** ... to mnie odstrasza! Idę i odświeżam matryce :))) –

+0

Dziękuję za odpowiedź! Imponuje mi to, ale muszę dać pierwszeństwo odpowiedzi Billa z powodu jego prostoty. Sprawdź mój komentarz poniżej odpowiedzi Billa. –