Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КУрсовик.docx
Скачиваний:
38
Добавлен:
18.12.2019
Размер:
840.89 Кб
Скачать

2 Области применения алгоритма на практике

Данный алгоритм находит большое применение в технике. Так, венцы зубчатых колес ограничены такими поверхностями: у цилиндрических зубчатых колес – цилиндрическими, у конических – коническими, у гипоидных – однополостными гиперболоидами. С помощью косых плоскостей образуются покрытия зданий, крылья ветряков, при строительстве шлюзовых сооружений и каналов. На основе винтовых поверхностей, а именно, прямого и наклонного геликоида изготавливают винты, сверла, пружины, шнеки, винтовые лестницы.

Поверхности тора часто встречаются в машиностроении. На основе циклических поверхностей проектируются конструкции газопроводов, гидротурбин, центробежных насосов, например, поверхность применяется в трубах переменного сечения. Трубчатая поверхность встречается в изогнутых трубах. В основе цилиндрических винтовых пружин лежит трубчатая винтовая поверхность. Каркасные поверхности заложены в проектировании и дизайне корпусов судов, самолётов, автомобилей.

Топографическая поверхность используется при изображении поверхности земли, а также поверхность лопаток турбин на теоретическом чертеже задается рядом сечений.

Таким образом, построение поверхностей часто используется в инженерных расчетах для различной сферы деятельности.

3 Описание использованных библиотек, стандартных классов, методов и функций

Для расчёта сложных функций я использовал библиотеки numpy,sympy,scipy которые позволяет считать сложные математические функции. Для от рисовки графиков была использована библиотека matplotlib, с помощью которой я реализовал вывод 3д графика изображение на экран. Для разработки интерфейса использовался PyQT 5.

Все классы используемые в программы были стандратные для PyQT 5, например setupUi для отрисовки интерфейса программы, MyWin для отображение окна программы.

В программе использовалось 17 функций, каждая функция соответствует типу поверхностей, зависимости от введенных данных вызывается нужна функция в которые передаются необходимые данные, а уже внутри функции происходит расчет точек. Так же есть две функции для рисования графика plot и plot 2, plot 2 рисует график и делает его зеркальную копию.

4 Описание разработанной программы

Список переменных и их назначения я привел в Таблице 1.

Таблица 1 – Список переменных и их назначение.

Название

Тип

Назначение

scr

Список

Массив данных – введенные коэфиценты

I1,I2,I3,I4,K1,K2,K3,K4

Число

Подсчет инваринтов

X,Y,Z,U,V

Список

Массив данных – значение точек

L1,L2,L3

Число

Подсчет λ1, λ2, λ3

Я сделал интерфейс в котором пользователь вводит 10 коэффициентов и после этого нажимает кнопку “Подсчет”, далее слева будет выводиться название поверхности и при необходимости график. Данные можно вводить вручную, так и загружая с помощью файла. После нажатия кнопки считать, график рассчитанный программой автоматический сохраниться в папке с программой

Рисунок 4 – Интерфейс программы

5 ОПИСАНИЕ ТЕСТОВОГО НАБОРА

Первый тестовый набор будет использовать уравнения мнимого конуса

Ожидаемый результат график мнимого конуса

Рисунок 5 – Мнимый конус

Второй тестовый набор это уравнение пары параллельных плоскостей

Ожидаемый результат это график с двумя параллельными плоскостями

Рисунок 6 – Пара параллельных плоскостей

6 ПРИМЕРЫ РАБОТЫ ПРОГРАММЫ

Для первого теста я выберу уравнение мнимого конуса, который имеет следующий вид

Вводим эти данные в нашу программу и нажимаем “Считать”.

Рисунок 5 – Результат работы программы

Как видим, результат работы программы совпал с введенным уравнением.

Для второго теста я выберу пару параллельных плоскостей . Уравнение будет иметь вид:

Рисунок 6 – Результат работы программы №2

Как видим все тесты выполениные в программе совпали с ожидаеми результатами. Это говорит о правильности написанной программы

ЗАКЛЮЧЕНИЕ

В ходе курсовой работы я проделал большую работу над разработкой программы на языке Python, которая строит поверхности второго порядка по входным данным, а именно 10 коэффициентам. Была разработана математическая модель на основе инвариантов и реализована в программе. Для разработки интерфейса я использовал PyQt5. В интерфейсе присутствует поле для ввода 10 коэффициентов, поле для вывода информации о виде построенном графике и две кнопки: считать и показать график.

Все тесты выполнение в программе совпали с ожидаемыми результатами, что говорит о правильности разработанной программы.

ЛИСТИНГ ПРОГРАММЫ

import sys

# Импортируем наш интерфейс из файла

from slog import *

from PyQt5 import QtCore, QtGui, QtWidgets

from PyQt5.QtWidgets import QApplication, QWidget, QLabel

import numpy as np

import scipy.stats as st

import matplotlib.pyplot as plt

import math

from scipy import integrate

from sympy import *

from mpl_toolkits.mplot3d import Axes3D

from matplotlib import cm

from PyQt5.QtGui import QIcon, QPixmap

class MyWin(QtWidgets.QMainWindow):

def __init__(self, parent=None):

QtWidgets.QWidget.__init__(self, parent)

self.ui = Ui_MainWindow()

self.ui.setupUi(self)

# Здесь прописываем событие нажатия на кнопку

self.ui.pushButton.clicked.connect(self.main)

self.ui.pushButton_2.clicked.connect(self.onClick)

def onClick(self):

self.SW = Second()

self.SW.show()

# Пока пустая функция которая выполняется

# при нажатии на кнопку

def main(self):

global str_source

str_source=[]

str_source.append((self.ui.lineEdit_2.text()))

str_source.append(self.ui.lineEdit.text())

str_source.append(self.ui.lineEdit_9.text())

str_source.append(self.ui.lineEdit_10.text())

str_source.append(self.ui.lineEdit_8.text())

str_source.append(self.ui.lineEdit_7.text())

str_source.append(self.ui.lineEdit_6.text())

str_source.append(self.ui.lineEdit_3.text())

str_source.append(self.ui.lineEdit_5.text())

str_source.append(self.ui.lineEdit_4.text())

sorc = [int(num) for num in str_source]

src=[]

for i in range(len(sorc)):

if (i >= 3) & (i != 9):

src.append(sorc[i] / 2)

else:

src.append(sorc[i])

print(src)

I1 = src[0] + src[1] + src[2]

I2 = round(np.linalg.det(np.array([[src[0], src[3]], [src[3], src[1]]])) + np.linalg.det(

np.array([[src[0], src[5]], [src[5], src[2]]])) + np.linalg.det(

np.array([[src[1], src[5]], [src[5], src[2]]])))

sigma = round(

np.linalg.det(np.array([[src[0], src[3], src[4]], [src[3], src[1], src[5]], [src[4], src[5], src[2]]])))

I3 = round(

np.linalg.det(np.array([[src[0], src[3], src[5]], [src[3], src[1], src[4]], [src[5], src[4], src[2]]])))

K2 = round(np.linalg.det(np.array([[src[0], src[6]], [src[6], src[9]]])) + np.linalg.det(

np.array([[src[1], src[7]], [src[7], src[9]]])) + np.linalg.det(

np.array([[src[3], src[8]], [src[8], src[9]]])))

K3 = round(np.linalg.det(

np.array([[src[0], src[3], src[6]], [src[3], src[1], src[7]], [src[6], src[7], src[9]]])) + np.linalg.det(

np.array([[src[0], src[5], src[6]], [src[5], src[2], src[8]], [src[6], src[8], src[9]]])) + np.linalg.det(

np.array([[src[1], src[4], src[7]], [src[4], src[2], src[8]], [src[7], src[8], src[9]]])))

K4 = round(np.linalg.det(np.array(

[[src[0], src[3], src[5], src[6]], [src[3], src[1], src[4], src[7]], [src[5], src[4], src[2], src[8]],

[src[6], src[7], src[8], src[9]]])))

delta = round(np.linalg.det(np.array(

[[src[0], src[3], src[4], src[6]], [src[3], src[1], src[5], src[7]], [src[4], src[5], src[2], src[4]],

[src[6], src[7], src[8], src[9]]])))

l = Symbol('l')

L = solve(l ** 3 - I1 * l ** 2 + I2 * l - I3, l)

L1 = int(L[0])

if len(L) == 2:

L2 = int(L[1])

elif len(L) == 3:

L2 = int(L[1])

L3 = int(L[2])

elif len(L) == 1:

L2 = 1

L3 = 1

if L1 == 0:

L1 = int(L2)

elif L2 == 0:

if len(L) == 3:

L2 = int(L3)

else:

L2 = int(L1)

elif L3 == 0:

L3 = int(L2)

if L1 == 0 and L2 == 0 and L3 == 0:

print('Eror')

print(L)

# генерация точек

# X, Y = np.meshgrid(np.arange(-1, 1, 0.25), np.arange(-1, 1, 0.25))

x = np.linspace(-2, 2, 100)

z = np.linspace(-2, 2, 100)

X, Y = np.meshgrid(x, z)

u = np.linspace(0, 2 * np.pi, 100)

v = np.linspace(0, np.pi, 100)

[u, v] = np.meshgrid(u, v)

print(L1, L2)

print(K3, I2)

if sigma != 0:

if I2 > 0 and I2 * sigma > 0:

if K4 < 0:

self.elipsoid(K4, I3, L1, L2, L3, u, v) # Элипсоид

elif K4 > 0:

self.mnim_elipsoid(K4, I3, L1, L2, L3, u, v) # Мнимый элипсоид

elif K4 == 0:

self.mnim_konus(L1, L2, L3, X, Y) # Мнимый конус

elif sigma == 0:

if K4 < 0:

self.elip_hyper(K4, I2, L1, L2, u, v) # Элип гиперболоид

elif K4 > 0:

self.hyper_parab(K4, I2, L1, L2, u, v) # Гиперболический параболоид

elif K4 == 0:

if I2 > 0:

if I1 * K3 < 0:

self.elip_cylin(K3, I2, L1, L2, X, Y) # Эллиптический цилиндр

elif I1 * K3 > 0:

self.mnim_elip_cylin(K3, I2, L1, L2, X, Y) # Мнимый эллиптический цилиндр

elif K3 == 0:

('Ошибка')

if I2 < 0:

if K3 != 0:

self.hyper_cylin(K3, I2, L1, L2, X, Y) # Гиперболический цилиндр

else:

self.para_peresl_plosk(L2, X, Y) # Пересек плоскости

if I2 == 0:

if K3 != 0:

self.parab_cylin(K3, I1, X, Y) # Парабалический цилиндр

if K3 == 0:

if K2 < 0:

self.parall_plosk(K2, I1, X, Y) # Паралель плоскости

elif K2 == 0:

self.sovp_plosk(X, Y) # Совмещенные плоскости

elif K3 > 0:

self.mnim_parall_plosk(K2, I1, X, Y) # Пара Паралель плоскости

else:

print('Ошибка')

def elipsoid(self,K4, I3, L1, L2, L3, X, Y):

# 6 5 4 0 0 0 0 0 0 -3

self.ui.lineEdit_11.setText("Элипсоид")

u = np.linspace(0, 2 * np.pi, 20)

v = np.linspace(0, np.pi, 20)

[u, v] = np.meshgrid(u, v)

x = 1 / np.sqrt(-K4 / (L1 * I3)) * np.outer(np.cos(u), np.sin(v))

y = 1 / np.sqrt(-K4 / (L2 * I3)) * np.outer(np.sin(u), np.sin(v))

z = 1 / np.sqrt(-K4 / (L3 * I3)) * np.outer(np.ones_like(u), np.cos(v))

self.plot(x, y, z)

def mnim_elipsoid(self,K4, I3, L1, L2, L3, u, v):

self.ui.lineEdit_11.setText("Мнимый элипсоид")

u = np.linspace(0, 2 * np.pi, 20)

v = np.linspace(0, np.pi, 20)

[u, v] = np.meshgrid(u, v)

x = 1 / np.sqrt(K4 / (L1 * I3)) * np.outer(np.cos(u), np.sin(v))

y = 1 / np.sqrt(K4 / (L2 * I3)) * np.outer(np.sin(u), np.sin(v))

z = 1 / np.sqrt(K4 / (L3 * I3)) * np.outer(np.ones_like(u), np.cos(v))

self.plot(x, y, z)

def mnim_konus(self,L1, L2, L3, u, v):

# 5 5 5 0 0 0 0 0 0 0

self.ui.lineEdit_11.setText("Мнимый конус")

X = u * np.cos(v)

Y = u * np.sin(v)

Z = u

self.plot2(X, Z, Y)

def elip_hyper(self,K4, I2, L1, L2, u, v):

# 1 1 0 0 0 0 -6 6 -4 18

self.ui.lineEdit_11.setText("Элиптический гипербалоид")

X = (1 / (L1) * np.sqrt(-K4 / I2)) * np.cos(u) + v * np.sin(u)

Y = (1 / (L2) * np.sqrt(-K4 / I2)) * np.sin(u) + v * np.cos(u)

Z = (1 / 2) * np.sinh(v)

self.plot(X, Y, Z)

def hyper_parab(self,K4, I2, L1, L2, u, v):

self.ui.lineEdit_11.setText("Гипер парабалоид")

X = (1 / (L1) * np.sqrt(-K4 / I2)) * np.cosh(u) * np.cos(v)

Y = -(1 / (L2) * np.sqrt(-K4 / I2)) * np.cosh(u) * np.sin(v)

Z = (1 / 2) * np.sinh(u)

self.plot2(X, Z, Y)

def elip_cylin(self,K3, I2, L1, L2, X, Z):

# 9 8 0 0 0 0 7 6 0 1

self.ui.lineEdit_11.setText("эллиптический цилиндр")

x = np.linspace(-1, 1, 100)

z = np.linspace(-2, 2, 100)

X, Z = np.meshgrid(x, z)

Y = np.sqrt(1 - (X ** 2 / (-K3 / (L1 * I2))) * (-K3 / (L2 * I2)))

self.plot2(X, Y, Z)

def mnim_elip_cylin(self,K3, I2, L1, L2, X, Y):

self.ui.lineEdit_11.setText("Мнимый эллиптический цилиндр")

x = np.linspace(-1, 1, 100)

z = np.linspace(-2, 2, 100)

X, Z = np.meshgrid(x, z)

Y = np.sqrt((1 - X ** 2 / (K3 / (L1 * I2))) * (K3 / (L2 * I2)))

self.plot2(X, Y, Z)

def hyper_cylin(self,K3, I2, L1, L2, X, Y):

# 5 -5 0 0 0 0 0 0 0 5

self.ui.lineEdit_11.setText("Гипер цилиндр")

u = np.linspace(-2, 2, 100)

v = np.linspace(-2, 2, 100)

[u, v] = np.meshgrid(u, v)

X = (-K3 / (L1 * I2)) * np.sinh(u)

Y = (K3 / (L2 * I2)) * np.cosh(u)

Z = v

self.plot2(X, Y, Z)

def para_peresl_plosk(self,L2, X, Z):

self.ui.lineEdit_11.setText("Пара пересекающихся плоскостей")

Y = np.sqrt(X ** 2)

self.plot2(X, Y, Z)

def parab_cylin(self,K3, I1, X, Z):

# 0 5 0 0 0 0 5 0 0 0

self.ui.lineEdit_11.setText("Парабалический цилиндр")

Y = 2 * X * np.sqrt(-K3 / I1 ** 3)

self.plot(X, Y ** 2, Z)

def parall_plosk(self,K2, I1, X, Z):

# 9 4 0 12 0 0 24 16 0 3

self.ui.lineEdit_11.setText("Пара паралельных плокостей")

Y = K2 / I1 ** 2

self.plot2(X, Y ** 2, Z)

def sovp_plosk(self,X, Y):

self.ui.lineEdit_11.setText("Пара мнимых паралельных плокостей")

x = np.linspace(-2, 2, 100)

z = np.linspace(-2, 2, 100)

X, Z = np.meshgrid(x, z)

Y = 0

self.plot2(X, Y ** 2, Z)

def mnim_parall_plosk(self,K2, I1, X, Y):

self.ui.lineEdit_11.setText("Пара мнимых паралельных плокостей")

x = np.linspace(-2, 2, 100)

z = np.linspace(-2, 2, 100)

X, Z = np.meshgrid(x, z)

Y = -K2 / I1 ** 2

self.plot2(X, Y ** 2, Z)

def plot(self,X, Y, Z):

fig = plt.figure()

ax = fig.gca(projection='3d')

surf = ax.plot_surface(X, Y, Z, rstride=2, cstride=10, linewidth=1, color='blue')

plt.savefig('save.png')

plt.show()

def plot2(self,X, Y, Z):

fig = plt.figure()

ax = fig.gca(projection='3d')

surf = ax.plot_surface(X, Y, Z, rstride=2, cstride=10, linewidth=1, color='blue')

surf = ax.plot_surface(X, -Y, Z, rstride=2, cstride=10, linewidth=1, color='blue')

plt.savefig('save.png')

plt.show()

class Second(QWidget):

def __init__(self):

super().__init__()

self.title = 'Images'

self.left = 10

self.top = 10

self.width = 1280

self.height = 800

self.initUI()

def initUI(self):

self.setWindowTitle(self.title)

self.setGeometry(self.left, self.top, self.width, self.height)

# Create widget

label = QLabel(self)

pixmap = QPixmap('save.png')

label.setPixmap(pixmap)

self.resize(pixmap.width(),pixmap.height())

self.show()

if __name__=="__main__":

app = QtWidgets.QApplication(sys.argv)

myapp = MyWin()

myapp.show()

sys.exit(app.exec_())

Соседние файлы в предмете Технология программирования