Вы получаете проблемы, потому что отрицательное число, возведенное в дробной степени может быть complex number.
Решение заключается в применении математической идентичности. Мы знаем, что если х отрицательно, то x 1/3 равно - ((- x) 1/3). Другими словами, мы превращаем x в положительное число, берем корень куба и снова отрицаем его. Вот код Python, чтобы сделать так:
def h(x):
if x >= 0:
return -1.0/x**(1.0/3.0)
else: # x < 0
return -h(-x)
Чтобы объяснить, почему вы получаете эту проблему, в первую очередь, это помогает взглянуть на реализацию x**y
(оператор питания). Ключевой математической идентичностью является то, что x y = exp (log (x) * y). Это тождество упрощает обработку полномочий, потому что экспонента обрабатывается как регулярное число и не нуждается в анализе (это целое число? Это доля? Отрицательно? И т. Д.).
Когда x - положительное число, log (x) - действительное число. Пока y также является действительным числом, exp (log (x) * y) будет действительным числом.
Но когда x является отрицательным числом, log (x) является комплексным числом. В частности, он равен log (-x) + pi * i. Когда мы умножим такое комплексное число на y, а затем применим exp(), результат будет обычно сложным числом, что вы не хотите.
Программисты Python обычно не используют 'lambda', когда функция будет вызываться по имени. Вы хотите определить именованные функции, такие как 'def h (x): return -1/x ** (1/3)'. – DyZ
Благодарим вас за отзыв. Я изменил определения соответствующим образом. – Galen
Ну, теперь у вас неправильный отступ.Я бы сказал, что это было хорошо, до тех пор, пока вы не знаете, что «лямбда» обычно не используется таким образом. –