питон: менее уродливое решение на пересечение 3 линии в 3-мерном пространстве


Я пометил это как домашнее задание, потому что изначально это был школьный проект, он был принят, но я не доволен код.

Я использовал cramers правило чтобы найти пересечение 3 линий в трехмерном пространстве даны Х, У и Z с коэффициентами, но код ужасный.

def trinomial():

       print "Trinomials require 3 equations with three variables each."
       firstX = input ("Please enter the coeficcient of X in the first equation: ")
       firstY = input ("Please enter the coefficient of Y in the first equation: ")
       firstZ = input ("Please enter the coefficient of Z in the first equation: ")
       firstA = input ("and what's after the = sign?")
       secondX = input ("Please enter the coefficient of X in the second equation: ")
       secondY = input ("Please enter the coefficient of Y in the second equation: ")
       secondZ = input ("Please enter the coefficient of Z in the second equation: ")
       secondA = input ("And what's after the = sign?")
       thirdX = input ("Please enter the coefficient of X in the third equation: ")
       thirdY = input ("Please enter the coefficient of Y in the third equation: ")
       thirdZ = input ("Please enter the coefficient of Z in the third equation: ")
       thirdA = input ("And what's after the = sign?")
       D= firstX*secondY*thirdZ+firstY*secondZ*thirdX+firstZ*secondX*thirdY-thirdX*secondY*firstZ-  thirdY*secondZ*firstX-thirdZ*secondX*firstY
       DX = firstA*secondY*thirdZ+firstY*secondZ*thirdA+firstZ*secondA*thirdY-thirdA*secondY*firstZ-thirdY*secondZ*firstA-thirdZ*secondA*firstY
       DY = firstX*secondA*thirdZ+firstA*secondZ*thirdX+firstZ*secondX*thirdA-thirdX*secondA*firstZ-thirdA*secondZ*firstX-thirdZ*secondX*firstA
       DZ = firstX*secondY*thirdA+firstY*secondA*thirdX+firstA*secondX*thirdY-thirdX*secondY*firstA-thirdY*secondA*firstX-thirdA*secondX*firstY
       #the next two if statements evaluate the D's, or determinants, to see if it's an inconsistant or identical systerm
       #if it's not, then it does the math to solve the equation
       if D == 0:
           print "Determinant is 0 evaluate for identical or inconsistant systems."
           if DX ==0 and DY == 0 and DZ == 0:
               print "System is dependant, there are infinite solutions"
               print
           else:
               print "System is inconsistant, there are no solutions"
               print
       if D != 0:
           AX = DX/D
           AY = DY/D
           AZ= DZ/D
       print "the solution to the set of equations is ("+str(AX)+","+str(AY)+","+str(AZ)+")."
       print

Я извиняюсь за огромную стену текста, код работает, и решения правильные, я просто хочу знать, есть ли аккуратнее способ сделать это.



605
3
задан 9 июня 2011 в 10:06 Источник Поделиться
Комментарии
1 ответ


  1. Вместо переменных firstX, secondX, thirdX, заменить их список х

  2. Не ставьте ввода и вычисления в одну и ту же функцию, отделить их

  3. Вы:

    если d == 0:
    некоторые вещи
    если d != 0:
    другие вещи


использовать вместо другого


  1. Ваши три строки расчета Д, ДХ, ДУ, DZ являются очень похожими. Сделать его функция.

  2. Термины, subtractd параллельно добавляются. Экстракт пара в функцию.

Вот мой результат:

DEPENDENT = 0
INCONSISTENT = 1
GOOD = 2

def determinant(X, Y, Z):
def term(x, y, z):
return X[x]*Y[y]*Z[z] - X[z]*Y[y]*Z[z]
return term(0, 1, 2) + term(2, 0, 1) + term(1,2,0)

def trinomial(X, Y, Z, A):

D = determinant(X, Y, Z)
DX = determinant(A, Y, Z)
DY = determinant(X, A, Z)
DZ = determinant(X, Y, A)
#the next two if statements evaluate the D's, or determinants, to see if it's an inconsistant or identical systerm
#if it's not, then it does the math to solve the equation
if D == 0:
if DX == 0 and DY == 0 and DZ == 0:
return DEPENDENT, None
else:
return INCONSISTENT, None
else:
return GOOD, [DX/D, DY/D, DZ/D]

def main():
print "Trinomials require 3 equations with three variables each."
X.append( input ("Please enter the coeficcient of X in the first equation: ") )
Y.append( input ("Please enter the coefficient of Y in the first equation: ") )
Z.append( input ("Please enter the coefficient of Z in the first equation: ") )
A.append( = input ("and what's after the = sign?") )

X.append( input ("Please enter the coeficcient of X in the second equation: ") )
Y.append( input ("Please enter the coefficient of Y in the second equation: ") )
Z.append( input ("Please enter the coefficient of Z in the second equation: ") )
A.append( = input ("and what's after the = sign?") )

X.append( input ("Please enter the coeficcient of X in the third equation: ") )
Y.append( input ("Please enter the coefficient of Y in the third equation: ") )
Z.append( input ("Please enter the coefficient of Z in the third equation: ") )
A.append( = input ("and what's after the = sign?") )

result, answer = trinomial(X, Y, Z, A)
if result == DEPENDENT:
print "System is dependant, there are infinite solutions"
print
elif result == INCONSISTENT:
print "System is inconsistant, there are no solutions"
print
else:
print "the solution to the set of equations is ("+ ",".join(map(str, answer)) + ")."
print

Но если вы делаете любое количество программирования Python с этим материалом, вы захотите узнать, как использовать библиотеки numpy, которые делают ваш код:

def trinomial(X, Y, Z, A):
system = numpy.array([X, Y, Z]).T
unknowns = numpy.array([A])

return numpy.linalg.solve(system, unknowns)

4
ответ дан 9 июня 2011 в 11:06 Источник Поделиться