在Python中反转某个等式的数字

时间:2014-10-07 12:57:52

标签: python numbers equation quadratic invert

我对此完全陌生,所以请原谅我,如果我看起来比其他人知之甚少。

我试图创建一个程序,允许我使用二次方程结合数学模块来计算x。我正在考虑计算,所以我想我会尝试这个挑战。我和我的老师看着它,但问题是平方根。 平方根函数不会使平方根成为负数,所以我试图找到一种方法来反转数字,使其为正而不是负数,因此将平方根。

from math import *
import math

a=int(input("a = "))
b=int(input("b = "))
c=int(input("c = "))

def qe(a,b,c):
    "Solves the quadratic for x"
    print(a,"x^2+",b,"x+",c,"=0",sep='')
    e=(b^2-sqrt(b-(4*a*c)))/(2*a)
    print("x =",e)
    return

这是现在代码的基础。还有一点额外的,但它只是测试找到问题。

任何评论肯定会受到赞赏。

另一方面,我考虑了另一个输入,当平方生根时,该输入将触发数字为sqrt' d小于0。这是一个可行的替代方案吗?

3 个答案:

答案 0 :(得分:1)

在解决实际问题之前,先做一些事情:

  • 第一个B前面应该有一个负号。
  • b^2不等同于“b平方”;你想要b**2
  • sqrt内的等式应为“B平方减去4AC”;你写了“B减4AC”。同样,sqrt外的B不应该是平方的。
  • 二次公式有两个解决方案,但你只显示一个;你可以在“B平方”和平方根部分之间加上或加号。

当二次公式指示您取负数的平方根时,这意味着X没有实数值。反转该值可以防止错误发生,您将得到无意义的结果。根据用户的数学专业水平,您应该显示错误消息,例如“不存在真正的解决方案”,或者只是继续打印复杂的解决方案。

from math import sqrt

a=int(input("a = "))
b=int(input("b = "))
c=int(input("c = "))

def qe(a,b,c):
    "Solves the quadratic for x"
    print(a,"x^2+",b,"x+",c,"=0",sep='')
    try:
        first_root  = (-b-sqrt(b**2-(4*a*c)))/(2*a)
        second_root = (-b+sqrt(b**2-(4*a*c)))/(2*a)
        print("x =",first_root)
        print("x =",second_root)
    except ValueError:
        print("No real solutions exist")

qe(a,b,c)

cmath模块允许您处理复数。特别是,它的sqrt将适用于负数。

from cmath import sqrt

a=int(input("a = "))
b=int(input("b = "))
c=int(input("c = "))

def qe(a,b,c):
    "Solves the quadratic for x"
    print(a,"x^2+",b,"x+",c,"=0",sep='')
    first_root  = (-b-sqrt(b**2-(4*a*c)))/(2*a)
    second_root = (-b+sqrt(b**2-(4*a*c)))/(2*a)
    print("x =",first_root)
    print("x =",second_root)

qe(a,b,c)

结果:

a = 1
b = 2
c = 3
1x^2+2x+3=0
No real solutions exist

或者

a = 1
b = 2
c = 3
1x^2+2x+3=0
x = (-1-1.4142135623730951j)
x = (-1+1.4142135623730951j)

对于具有实数解的方程,两种方法的结果都相同。 (尽管使用cmath的那个格式不会很好)

a = 1
b = 1
c = 0
1x^2+1x+0=0
x = -1.0
x = 0.0

答案 1 :(得分:0)

你需要使用cmath模块来计算负数sqrt,你也不能使用^来获取权力!您可以使用math.pow(x, y)功能或使用b*b

import cmath

a=int(input("a = "))
b=int(input("b = "))
c=int(input("c = "))

def qe(a,b,c):
    "Solves the quadratic for x"
    print(a,"x^2+",b,"x+",c,"=0")
    e=(b*b-cmath.sqrt(b-(4*a*c)))/(2*a)
    print("x =",e)
    return
qe(a,b,c)

结果:

a = 2
b = 3
c = 4
(2, 'x^2+', 3, 'x+', 4, '=0')
('x =', (2.25-1.346291201783626j))

答案 2 :(得分:0)

您可以通过将其包装在abs()中来确保该值为正,以获得绝对值。但是,正如其他人所评论的那样,会给出数学上不正确的结果。您可以报告“没有真正的根”或处理复杂的数字(请查看cmath模块)。

此外,您的二次公式中存在错误 - 但我认为这是问题中的拼写错误(-bb**2位于错误的位置)。

sqrt之前的运算符应为正或负 - 有两个根要找。

我会尝试类似的事情:

try:
  temp = sqrt(b**2 - 4*a*c)
except ValueError:
  print("No real roots")
else:
  r1 = (-b+temp)/(2*a)
  r2 = (-b-temp)/(2*a)
  if r1==r2:
    print("x=",r1)
  else:
    print("x=",r1," or ",r2)