Проблема не имеет ничего общего с тем, что n
меньше 1 или нет. Проблема возникает всякий раз, когда (n+1)/n
не является идеальным целым числом. Тогда r**((n+1)/n)
не является четко определенным для чисел с плавающей запятой, для отрицательных r
, как объяснено, например, в в этом посте . Просто попробуйте n = 2
, и вы заметите, что оно также не имеет значения для любого отрицательного r
.
Обратите также внимание, что ваша python формула начинается с (n/n+1)
, в то время как ваша математическая формула начинается с (n/(n+1))
.
Чтобы нарисовать симметричную c кривую, вы можете просто скопировать и отразить положительную часть.
import numpy as np
from matplotlib import pyplot as plt
n = 0.4
k = 0.479862
p = 9470
r = np.linspace(0, 0.0127, 100)
d = 0.0254
u = (n/(n+1))*(p/(2*k))** (1/n)*(d**((n+1)/n) - r**((n+1)/n))
plt.xlabel('Radius m')
plt.ylabel('Velocity l/min')
plt.plot(np.concatenate([-r[::-1], r]), np.concatenate ([u[::-1], u]))
plt.show()
Вот результирующая кривая с первым множителем формула адаптирована (n/(n+1)
), для n=0.4
. ![resulting plot](https://i.stack.imgur.com/xmVpX.png)
Кроме того, вы можете преобразовать все в комплексные числа и построить их действительную и мнимую части отдельно. Следовательно, вы конвертируете r
, используя r.astype(np.complex)
. И np.imag(u)
для получения мнимой части u
.
import numpy as np
from matplotlib import pyplot as plt
n = 0.4
k = 0.479862
p = 9470
r = np.linspace(-0.02, 0.02, 500)
r = r.astype(np.complex)
d = 0.0254
u = n / (n + 1) * (p / (2 * k)) ** (1 / n) * (d ** ((n + 1) / n) - r ** ((n + 1) / n))
plt.xlabel('Radius m')
plt.ylabel('Velocity l/min')
plt.plot(r, u, color='dodgerblue', label='real part')
plt.plot(r, np.imag(u), color='crimson', label='imaginary part')
plt.legend()
plt.show()
![plot with real and imaginary part](https://i.stack.imgur.com/xaSGJ.png)