Задний план
Я прочитал здесь, что метод Ньютона не работает с функцией x^(1/3)
, когда его начальный шаг равен 1. Я пытаюсь проверить его в блокноте julia jupyter.
Я хочу напечатать график функции x^(1/3)
затем я хочу запустить код
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)
я получил
Я изменил код на
f = x->(x+0im)^(1/3)
plot(f,-1,1)
я получил
Я хочу, чтобы мой сюжет выглядел как сюжет x^(1/3)
в гугле
However I can not print more than a half of it
Этот сюжет Google не имеет для меня никакого смысла. Для x > 0
это нормально, но для отрицательных значений x
правильный результат сложный, и график Google показывает минус абсолютного значения, что странно.
Ниже вы можете увидеть вывод Matlab, который менее привередлив к типам, чем Julia. Как видите, это не согласуется с вашим сюжетом.
Из графика видно, что положительные значения 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()