#python
#python
Вопрос:
import math
from fractions import Fraction
Lis = [
1, 2 , 3 , 6 , 1/2 , 1/3 , 1/4 , 1/6 , 1/12 , 2/3, 3/2, 3/4,
-1,-2,-3,-6, -1/2 , -1/3 , -1/4 , -1/6 , -1/12 , -2/3, -3/2, -3/4
]
for x in lis:
if abs((12(x^3) - 32 (x^2) 25 (x) - 6 ) - 0) == 1*max (abs(12 (x)^3 - 32 (x^2) 25 (x) - 6), abs (0)) == True :
print(x, end = ', ')
Я пытался решить полиномиальную функцию с помощью python, но столкнулся с благословением; в результате я составляю список возможных нулей функции, поэтому следующим из этого списка, используя цикл for, я попытался ввести эти числа в уравнение, но я нахожу только два ответа 1/2,и 3/2 по нулям было пропущено 3/2 из-за его десятичного повторения 0,6666667; в результате это число дает не ноль, а 2/3, поэтому мой вопрос: есть ли какой-либо способ избавиться от этой проблемы и получить результат
1/2, 2/3 и 3/2?
Комментарии:
1. @Jordan — в вашем коде есть ошибки: 1)
^
является побитовым оператором xor,**
является возведением в степень, 2) Вы определяетеLis
, но ваш цикл for имеетfor x in lis
. 3) Вам нужно*
умножить значение между константами и переменной, т.е.12*(x**3)
вместо 12 (x) ^ 3. Кроме того, это не ошибка, но в чем смысл abs(0) по сравнению с простым использованием 0 (вводит путаницу)?
Ответ №1:
вы можете использовать math
package и with isclose
вместо ==
you can solve . проблема, если вы используете python 3.5=< версия
import math
math.isclose(1.656, 1655, abs_tol=0.001)
результат
True
если ваша версия 3.5>, вы можете определить ее следующим образом:
def isclose(a, b, rel_tol=1e-09, abs_tol=0.0):
return abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)
итак, ваш целевой код будет таким, как показано ниже:
import math
from fractions import Fraction
Lis = [
1, 2 , 3 , 6 , 1/2 , 1/3 , 1/4 , 1/6 , 1/12 , 2/3, 3/2, 3/4,
-1,-2,-3,-6, -1/2 , -1/3 , -1/4 , -1/6 , -1/12 , -2/3, -3/2, -3/4
]
for x in Lis:
first_value = abs((12. * (x ^ 3) - 32. * (x ^ 2) 25. * (x) - 6.) - 0)
sec_value = 1 * max(abs(12. * (x ^ 3) - 32. * (x ^ 2) 25. * x - 6.), abs(0))
if math.isclose(first_value, sec_value, abs_tol=0.001):
print(x, end=', ')
Комментарии:
1. Подробнее об
isclose
этом можно найти здесь: python.org/dev/peps/pep-04852. @MaryamAbdoli — этот код выдает ошибку
TypeError: unsupported operand type(s) for ^: 'float' and 'int'
Ответ №2:
Проблемы с операционным кодом
- Вы импортируете модуль дроби, но не используете его
- ^ — побитовый оператор xor, ** — возведение в степень,
- Вы определяете Lis, но ваш цикл for имеет for x в lis.
- Вам нужно * между константами и переменной для умножения, т.е. 12 * (x ** 3), а не 12 (x) ^ 3.
Код
import math
from fractions import Fraction
# Use Fraction for fractional numbers
Lis = [
1, 2 , 3 , 6 , Fraction('1/2'), Fraction('1/3'), Fraction('1/4'), Fraction('1/6'),
Fraction('1/12'), Fraction('2/3'), Fraction('3/2'), Fraction('3/4'),
-1, -2, -3, -6, Fraction('-1/2'), Fraction('-1/3'), Fraction('-1/4'),
Fraction('-1/6'), Fraction('-1/12'), Fraction('-2/3'), Fraction('-3/2'), Fraction('-3/4')
]
for x in Lis:
value = 12*(x**3) - 32*(x**2) 25*x - 6
if value == 0: # Now we can compare value to absolute 0 (since we use Fraction)
print(x, end=', ')
Вывод (выводит дроби)
1/2, 2/3, 3/2,