График функции, DomainError. Возведение в степень, дающее сложный результат, требует сложного аргумента

Задний план

Я прочитал здесь, что метод Ньютона не работает с функцией x^(1/3), когда его начальный шаг равен 1. Я пытаюсь проверить его в блокноте julia jupyter.

  1. Я хочу напечатать график функции x^(1/3)

  2. затем я хочу запустить код

f = x->x^(1/3)
D(f) = x->ForwardDiff.derivative(f, float(x))
x = find_zero((f, D(f)),1, Roots.Newton(),verbose=true)

Проблема: Как распечатать график функции x^(1/3) в диапазоне, например (-1,1)

Я старался

f = x->x^(1/3)
plot(f,-1,1)

я получил

График функции, DomainError. Возведение в степень, дающее сложный результат, требует сложного аргумента

Я изменил код на

f = x->(x+0im)^(1/3)
plot(f,-1,1)

я получил

График функции, DomainError. Возведение в степень, дающее сложный результат, требует сложного аргумента

Я хочу, чтобы мой сюжет выглядел как сюжет x^(1/3) в гугле График функции, DomainError. Возведение в степень, дающее сложный результат, требует сложного аргумента

However I can not print more than a half of it

График функции, DomainError. Возведение в степень, дающее сложный результат, требует сложного аргумента

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
303
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Этот сюжет Google не имеет для меня никакого смысла. Для x > 0 это нормально, но для отрицательных значений x правильный результат сложный, и график Google показывает минус абсолютного значения, что странно.

Ниже вы можете увидеть вывод Matlab, который менее привередлив к типам, чем Julia. Как видите, это не согласуется с вашим сюжетом.

Plot of x^(1/3)

Из графика видно, что положительные значения x дают действительный ответ, а отрицательные x дают комплексный ответ. Причина ошибок Джулии для отрицательных входных данных заключается в том, что они очень обеспокоены стабильностью типов. Зависимость выходного типа функции от входного стоимость приведет к нестабильности типа, что ухудшит производительность. Это меньше беспокоит Matlab или Python и т. д.

Если вам нужен график, подобный приведенному выше в Джулии, вы можете определить свою функцию следующим образом:

f = x -> sign(x) * abs(complex(x)^(1/3))

Редактировать: На самом деле лучше и быстрее версия

f = x -> sign(x) * abs(x)^(1/3)

Да, это выглядит неуклюже, но это потому, что вы хотите действительно странный сюжет, который имхо не имеет смысла для функции x^(1/3).

Ответ принят как подходящий

Это потому, что x^(1/3) не всегда возвращает реальный (как в числах) результат или реальный кубический корень из x. Для отрицательных чисел функция возведения в степень с некоторыми степенями, такими как (1/3 или 1,254 и, я полагаю, все нецелые числа), вернет Complex. Для требований стабильности типов в Julia эта операция, примененная к отрицательному Real, дает DomainError. Это поведение также отмечено в разделе Часто задаваемые вопросы руководства Julia.

julia> (-1)^(1/3)
ERROR: DomainError with -1.0:
Exponentiation yielding a complex result requires a complex argument.
Replace x^y with (x+0im)^y, Complex(x)^y, or similar.

julia> Complex(-1)^(1/3)
0.5 + 0.8660254037844386im

Обратите внимание, что поведение возврата комплексного числа для возведения в степень отрицательных значений на самом деле не отличается, скажем, от поведения MATLAB.

>>> (-1)^(1/3)

ans =

0.5000 + 0.8660i

Однако вам нужно построить корень настоящий куб.

Вы можете пойти с

plot(x -> x < 0 ? -(-x)^(1//3) : x^(1//3), -1, 1)

чтобы применить настоящий кубический корень или вместо этого использовать встроенную функцию cbrt.

plot(cbrt, -1, 1)

У него также есть псевдоним .

plot(∛, -1, 1)

F(x) — это нечетная функция, вы просто используете [0 1] в качестве входной переменной.

Сюжет на [-1 0] вычитается следующим образом

Код ниже

import numpy as np

import matplotlib.pyplot as plt

# Function f 
f = lambda x: x**(1/3)


fig, ax = plt.subplots()

x1 = np.linspace(0, 1, num = 100)
x2 = np.linspace(-1, 0, num = 100)
ax.plot(x1, f(x1))
ax.plot(x2, -f(x1[::-1]))


ax.axhline(y=0, color='k')
ax.axvline(x=0, color='k')
plt.show()

участок

Другие вопросы по теме