Добавление функций модуля Питон на лист в LibreOffice Calc

Автор juceser, 31 марта 2025, 11:41

0 Пользователи и 1 гость просматривают эту тему.

juceser

С предыдущей ошибкой разобрался, там ошибка была в написании функции z, пропущен sin и вместо math.sin(x) было math(x). При этом синтаксический контроль был пройден.

Сейчас завис на поверхности -

def xyz(x, y):
    return ((3*math.exp(-2*y))*(x**2)) - ((2*math.cos(x))*(math.sin(y))*(y**2))

x0, xk, dx = -1, 1, 0.1
y0, yk, dy = -1.2, 1.2, 0.1
nx = round((xk-x0)/dx) + 1
ny = round((yk-y0)/dy) + 1   

u, v = np.mgrid[x0:xk:nx*1j, y0:yk:ny*1j]
z3 = xyz(u, v)
fig = plt.figure()
plt.suptitle('Поверхность')
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(u, v, z3, cmap='inferno');
plt.show()

Код не проходит, получается что функция слишком сложная что-ли, хотя она считаемая.

---------------------------------------------------------------------------
TypeError                                Traceback (most recent call last)
Cell In[39], line 9
      6 ny = round((yk-y0)/dy) + 1   
      8 u, v = np.mgrid[x0:xk:nx*1j, y0:yk:ny*1j]
----> 9 z3 = xyz(u, v)
    10 fig = plt.figure()
    11 plt.suptitle('Поверхность')

Cell In[39], line 2, in xyz(x, y)
      1 def xyz(x, y):
----> 2    return ((3*math.exp(-2*y))*(x**2))

TypeError: only length-1 arrays can be converted to Python scalars

При этом если функцию упростить до


def xyz(x, y):
    return (y*(x**2))
x0, xk, dx = -1, 1, 0.1
y0, yk, dy = -1.2, 1.2, 0.1
nx = round((xk-x0)/dx) + 1
ny = round((yk-y0)/dy) + 1   

u, v = np.mgrid[x0:xk:nx*1j, y0:yk:ny*1j]
z3 = xyz(u, v)
fig = plt.figure()
plt.suptitle('Поверхность')
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(u, v, z3, cmap='inferno');
plt.show()


то строит поверхность.

juceser

Итак решение полностью найдено - все выполнено на платформе Anaconda через jupyter notebook.
Далее весь код засовываем в консоль и все интерактивно отображается в браузере.

Предыдущая проблема также решена, оказывается здесь нужно обращаться почему-то не к модулю math, как делали в графиках, а к модулю numpy as np -

def xyz(x, y):
    return ((3*np.exp(-2*y))*(x**2)) - ((2*np.cos(x))*(np.sin(y))*(y**2))

# Исходные данные   

x0, xk, dx = -1, 1, 0.1
y0, yk, dy = -1.2, 1.2, 0.1
nx = round((xk-x0)/dx) + 1
ny = round((yk-y0)/dy) + 1   

# Построение графика

u, v = np.mgrid[x0:xk:nx*1j, y0:yk:ny*1j]
z3 = xyz(u, v)
fig = plt.figure()
plt.suptitle('Поверхность')
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(u, v, z3, cmap='inferno');
# Сохранение графика в PNG
plt.savefig("plot_surf.png", format="png")  # Также можно сохранить как JPG или SVG, изменив формат
plt.show()

Тогда этот же код спокойно работает.

Да, осталась непонятка с сохранением графика plt.savefig, поскольку функция не терпит в имени указание абсолютного пути, но пусть уж сохраняет (а она сохраняет) в профиле. Хотелось бы большего, сохранить весь вывод скажем в pdf или html, и это вроде тоже как должно работать, но File - Save and export Notebook As выдает в меню все варианты серым. Ладно, будем считать, что это не работает. Задача в целом выполнена без LO.