Решение инженерно-технических задач с использованием средств визуального программирования
Расчет трансформатора питания. Численное решение нелинейных уравнений с заданной точностью и дифференциальных уравнений первого порядка. Разработка программы с использованием средств визуального программирования на алгоритмическом языке программирования.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 17.08.2013 |
Размер файла | 1,2 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
КУРСОВАЯ РАБОТА
по дисциплине "Информатика"
РЕШЕНИЕ ИНЖЕНЕРНО-ТЕХНИЧЕСКИХ ЗАДАЧ С ИСПОЛЬЗОВАНИЕМ СРЕДСТВ ВИЗУАЛЬНОГО ПРОГРАММИРОВАНИЯ
Оглавление
- Введение
- 1. Расчет трансформатора питания
- 2. Расчет и построение амплитудно-частотной характеристики колебательного контура
- 3. Численное интегрирование аналитически заданной функции
- 4. Численное решение нелинейных уравнений с заданной точностью
- 5. Численное решение дифференциальных уравнений первого порядка
- Заключение
- Список используемой литературы
Введение
Автоматизации процесса вычислений, компьютерная обработка данных позволяет сократить сроки выполнения инженерно-технических построений увеличить точность получаемых результатов. Для того, чтобы ознакомиться с этими процессами, была выполнена данная курсовая работа.
Цель работы:
1. Дальнейшее развитие и закрепление знаний основ информатики.
2. Умение решать с помощью персонального компьютера задач программными методами с возможным использованием одного из алгоритмических языков программирования.
3. Реализация поставленных инженерно-технических задач на персональном компьютере с помощью средств визуального программирования, а именно средствами языка программирования Python.
С использованием средств визуального программирования необходимо написать программы для решения пяти задач:
1. Расчет трансформатора питания.
2. Расчет и построение амплитудно-частотное характеристики колебательного контура.
3. Численное интегрирование аналитически заданной функции.
4. Численное решение нелинейных уравнений с заданное точностью.
5. Численное решение дифференциальных уравнений первого порядка.
Программы должны позволять вводить исходные данные, выводить необходимые расчетные параметры.
В ходе написания курсовой работы необходимо ознакомиться с некоторыми темами из таких предметов, как высшая математика и физика.
1. Расчет трансформатора питания
Постановка задачи:
По заданным значениям напряжения сети, площади сечения выбранного сердечника, требуемому количеству вторичных обмоток, величинам их напряжения и тока рассчитать количество витков и диаметр провода в каждой обмотке.
Исходные данные:
U, В |
S, Кв. см |
n |
m |
U1, В |
I1, А |
U2, В |
I2, А |
U3, В |
I3, А |
|
110 |
4 |
0,82 |
2 |
9 |
5,0 |
6 |
5,0 |
- |
- |
Для расчетов используются следующие приближенные зависимости:
Габаритная мощность (P) трансформатора вычисляется по формуле
(ватт),
где m - количество вторичных обмоток, n - коэффициент полезного действия; U (i) - напряжение на i-ой вторичной обмотке (вольт); I (i) - величина тока в i-ой вторичной обмотке (ампер).
Количество витков первичной обмотки трансформатора определяется зависимостью:
где U - напряжение сети (вольт); S - площадь сечения сердечника (кв. см).
Диаметр провода первичной обмотки определяется по формуле:
(мм).
Количество витков i-ой вторичной обмотки - по выражению:
.
Диаметр провода i - ой вторичной обмотки - по формуле:
(мм).
Структура программы:
1. Подключение библиотек
2. Ввод исходные данные
3. Написание функции calc для вычисления K (i), D (i), Ko и Do в зависимости от введенного пользователем U, Ui, Ii, i
4. Описание в окне буквенных обозначений
5. Создание виджетов
5.1. Создание полей для введения пользователем U, Ui, Ii, i
5.2. Создание в окне ячеек для выведения конечного результата
5.3. Создание в окне кнопок
5.4. Отображение главного окна
Код программы:
# - * - coding: utf-8 - *-
# импорт библиотек
from math import*
from Tkinter import*
# ввод исходных данных (из табл.1)
S=4
n=0.82
Ui= []
Ii= []
# написание функции для вычисления K (i), D (i), Ko и Do в зависимости от введенного пользователем U, Ui, Ii, i
def calc ():
P=0
x=int (x_entry. get ())
x=x-1
U=int (U_entry. get ())
Ui. append (int (U1_entry. get ()))
Ui. append (int (U2_entry. get ()))
Ii. append (int (I1_entry. get ()))
Ii. append (int (I2_entry. get ()))
for i in range (2):
P+=Ui [i] *Ii [i]
P=P/n
Ko= (1.83) * (10**6) * (0.95) / (U*S)
Ko='%.3f' % Ko
Ko_label. configure (text= ('Ko=',Ko))
Do=sqrt (P/ (U*2))
Do='%.3f' % Do
Do_label. configure (text= ('Do=',Do))
Pk=38*Ui [x] *1.05/S
Pk='%.3f' % Pk
Ki_label. configure (text= ('Ki=',Pk))
Pd=sqrt (Ii [x] /2.0)
Pd='%.3f' % Pd
Di_label. configure (text= ('Di=',Pd))
программирование трансформатор питание алгоритмический
# осуществление вывода на экран окна программы и последующим выводом результатов вычисления
root = Tk ()
root. title ("Задание № 1")
frame = Frame (root)
frame. pack ()
t1_label = Label (frame, bg='green', text="Вычисление количества витков и диаметра провода i-ой вторичной обмотки трансформатора", font='arial 10')
t1_label. grid (row=0, column=1, columnspan=4, padx=25,pady=15)
# написание в окне буквенных обозначений
t3_label = Label (frame, text="P - габаритная мощность трансформатора; ")
t3_label. grid (row=1, column=0, columnspan=4, sticky=W, padx=5)
t4_label = Label (frame, text="m - количество вторичных обмоток; ")
t4_label. grid (row=2, column=0, columnspan=4, sticky=W, padx=5)
t5_label = Label (frame, text="n - коэффициент полезного действия; ")
t5_label. grid (row=3, column=0, columnspan=4, sticky=W, padx=5)
t6_label = Label (frame, text="U (i) - напряжение на i-ой вторичной обмотке; ")
t6_label. grid (row=4, column=0, columnspan=4, sticky=W, padx=5)
t7_label = Label (frame, text="I (i) - величина тока в i-ой вторичной обмотке; ")
t7_label. grid (row=5, column=0, columnspan=4, sticky=W, padx=5)
t8_label = Label (frame, text="Ko - количество витков первичной обмотки трансформатора. ")
t8_label. grid (row=6, column=0, columnspan=4, sticky=W, padx=5)
t9_label = Label (frame, text="U - напряжение сети; ")
t9_label. grid (row=1, column=3, columnspan=4, sticky=W, padx=5)
t10_label = Label (frame, text="S - площадь сечения сердечника; ")
t10_label. grid (row=2, column=3, columnspan=4, sticky=W, padx=5)
t11_label = Label (frame, text="Do - диаметр провода первичной обмотки трансформатора; ")
t11_label. grid (row=3, column=3, columnspan=4, sticky=W, padx=5)
t12_label = Label (frame, text="K (i) - количество витков i-ой вторичной обмотки трансформатора; ")
t12_label. grid (row=4, column=3, columnspan=4, sticky=W, padx=5)
t13_label = Label (frame, text="D (i) - диаметр провода i-ой вторичной обмотки трансформатора; ")
t13_label. grid (row=5, column=3, columnspan=4, sticky=W, padx=5)
# поле для введения пользователем U, Ui, Ii, i
x_label = Label (frame, text="Введите i (от 1 до 2)")
x_label. grid (row=7, column=0, padx=5)
x_entry = Entry (frame, width=10)
x_entry. grid (row=7, column=1,sticky=W, pady=5, padx=5)
#
U_label = Label (frame, text="Введите U")
U_label. grid (row=7, column=2)
U_entry = Entry (frame, width=10)
U_entry. grid (row=7, column=3,sticky=W, pady=5, padx=5)
#
U1_label = Label (frame, text="Введите U1")
U1_label. grid (row=8, column=0, padx=5)
U1_entry = Entry (frame, width=10)
U1_entry. grid (row=8, column=1,sticky=W, pady=5, padx=5)
#
U2_label = Label (frame, text="Введите U2")
U2_label. grid (row=9, column=0, padx=5)
U2_entry = Entry (frame, width=10)
U2_entry. grid (row=9, column=1,sticky=W, pady=5, padx=5)
#
I1_label = Label (frame, text="Введите I1")
I1_label. grid (row=8, column=2, padx=5)
I1_entry = Entry (frame, width=10)
I1_entry. grid (row=8, column=3,sticky=W, pady=5, padx=5)
#
I2_label = Label (frame, text="Введите I2")
I2_label. grid (row=9, column=2, padx=5)
I2_entry = Entry (frame, width=10)
I2_entry. grid (row=9, column=3,sticky=W, pady=5, padx=5)
# размещение в окне ячеек для выведения конечного результата
Ko_label = Label (frame, bg='white', text= ("Ko=?"))
Ko_label. grid (row=7, column=4, sticky=W, padx=2)
Ki_label = Label (frame, width=10, bg='white', text="Ki=?")
Ki_label. grid (row=7, column=5,pady=5)
Do_label = Label (frame, bg='white', text= ("Do=?"))
Do_label. grid (row=8, column=4, sticky=W, padx=2)
Di_label = Label (frame, bg='white', text="Di=?")
Di_label. grid (row=8, column=5,pady=5)
# выведение в окне кнопок "Вычислить" и "Выйти"
eval_button = Button (frame, bg='green', text="Вычислить", command=calc)
eval_button. grid (row=9, column=4, sticky=W, pady=10)
exit_button = Button (frame, bg='grey', text="Выйти", command=root. destroy)
exit_button. grid (row=9, column=5, padx=10,pady=10)
#
root. mainloop ()
Результат решения:
Вывод:
По заданным значениям напряжения сети, площади сечения выбранного сердечника, требуемому количеству вторичных обмоток, величинам их напряжения и тока было рассчитано количество витков и диаметр провода в каждой обмотке.
2. Расчет и построение амплитудно-частотной характеристики колебательного контура
Постановка задачи:
По заданному выражению для амплитудно-частотной характеристики резонансного контура
,
Где K - коэффициент усиления, WP - резонансная частота, W - текущая частота,
Z - относительный коэффициент затухания, рассчитать таблицу значений A (W) при изменении частоты W от 0 до Wкон с шагом DW=0,1*Wкон при различных значениях относительного коэффициента затухания Z, изменяющегося от Zнач до Zкон с шагом Zшаг.
По данным таблицы построить на осях координат A (W), W графики изменения амплитуды A (W) от частоты W для различных значений Z.
Исходные данные:
K |
WP |
Wкон |
Zнач |
Zкон |
Zшаг |
|
7,5 |
8,5 |
17 |
0,2 |
0,8 |
0,30 |
Структура программы:
1. Подключение библиотек
2. Введение исходных данных
3. Расчет значений Z
4. Создание виджетов
4.1. Создание главного окна
4.2. Создание графика относительно исходных данных
4.3. Описание в окне буквенных обозначений
4.4. Создание таблицы значений
4.5. Отображение главного окна
Код программы:\
# * - coding: utf-8 - *-
from Tkinter import *
from math import*
k=7.5
wp=8.5
wk=17
wo=0
dw=1.7
zn=0.2
zk=0.8
dz=0.3
z=zn
m= []
w0=0
s= []
while zn <= 0.8:
s= []
for i in range (0, 17.01):
a1= (k* (wp**2)) / (sqrt ( ( ( (wp**2) - (w0**2)) **2) + 4* (zn**2) * (wp**2) * (w0**2)))
s. append (a1)
w0=w0+dw
zn=zn+dz
m. append (s)
root = Tk () # создание окна
root. title ("2 задание ")
#
canvas2=Canvas (root,bg='white', width =200, height=220)
canvas2. grid (row=5, column=1,padx=10,pady=10)
point1=m [0]
points1= []
dx=1.7
for i in range (0,17):
y=point1 [i]
pp= (12*i*dx, 200-11*y)
points1. append (pp)
def line1 ():
canvas2. create_line (points1,fill="blue",smooth=1)
canvas2. create_text (40,75,text="при z=0.2")
point2=m [1]
points2= []
dx=1.7
for i in range (0,17):
y=point2 [i]
pp= (12*i*dx, 200-100*y)
points2. append (pp)
def line2 ():
canvas2. create_line (points2,fill="red",smooth=1)
canvas2. create_text (40,175,text="при z=0.5")
point3=m [2]
points3= []
dx=1.7
for i in range (0,17):
y=point3 [i]
pp= (12*i*dx, 200-200*y)
points3. append (pp)
def line3 ():
canvas2. create_line (points3,fill="black",smooth=1)
canvas2. create_text (105, 209,text="при z=0.8")
#
y_axe= []
yy= (10,0)
y_axe. append (yy)
yy= (10,220)
y_axe. append (yy)
canvas2. create_line (y_axe,fill="black",width=1)
canvas2. create_line (8,8,10,3,fill="black",width=1)
canvas2. create_line (10,3,12,8,fill="black",width=1)
canvas2. create_text (25,15,text="A (W)")
#
x_axe= []
xx= (0, 200)
x_axe. append (xx)
xx= (299, 200)
x_axe. append (xx)
canvas2. create_line (x_axe,fill="black",width=1)
canvas2. create_line (192, 198, 197, 200,fill="black",width=1)
canvas2. create_line (192, 202, 197, 200,fill="black",width=1)
canvas2. create_text (190,213,text="W")
#
t1_label = Label (root, bg='green', fg='black', text="Расчет и построение амплитудно-частотной характеристики \nс колебательного контура", font='arial 12')
t1_label. grid (row=0, column=0, columnspan=2, padx=25,pady=15)
t2_label = Label (root, text="A (W) - амплитуда колебаний; ")
t2_label. grid (row=1, column=1, columnspan=4, sticky=W, padx=5)
t3_label = Label (root, text="W - частота; ")
t3_label. grid (row=2, column=1, columnspan=4, sticky=W, padx=5)
t4_label = Label (root, text="Z - относительный коэффициент затухания; ")
t4_label. grid (row=3, column=1, columnspan=4, sticky=W, padx=5)
#
eval_button = Button (root, bg='green', fg='black',text="График при Z =0.2", width=19,command=line1)
eval_button. grid (row=1, column=0, padx=10,pady=10)
eval1_button = Button (root, bg='green', fg='black',text="График при Z =0.5", width=19,command=line2)
eval1_button. grid (row=2, column=0, padx=10,pady=10)
eval1_button = Button (root, bg='green', fg='black',text="График при Z =0.8", width=19,command=line3)
eval1_button. grid (row=3, column=0, padx=10,pady=10)
#
exit_button = Button (root, bg='grey', fg='black',text="Exit", width=10,command=root. destroy)
exit_button. grid (row=4, column=0, padx=10,pady=10)
#
text1=Text (root,width=30, height=15, font = "areal 10")
text1. grid (row=5, column=0,padx=10,pady=10)
text1. insert (END, "W\t A (Z1) \t A (Z2) \t A (Z3) \n")
for i in range (11):
text1. insert (END, "%.2f \t %.2f \t %.2f \t %.2f\n" % (i*dw,point1 [i],point2 [i], point3 [i]))
#
root. mainloop ()
Результат решения:
Вывод:
Была рассчитана таблицу значений A (W) при изменении частоты W от 0 до Wкон, при различных значениях относительного коэффициента затухания Z, изменяющегося от Zнач до Zкон. По данным таблицы были построены на осях координат A (W), W графики изменения амплитуды A (W) от частоты W для различных значений Z.
Из графика видно, что при увеличении относительного коэффициента затухания амплитуда резонансного контура возрастает при средних значениях текущей частоты.
3. Численное интегрирование аналитически заданной функции
Постановка задачи:
По заданному выражению аналитической функции f (x) вычислить приближенно определенный интеграл от этой функции на заданном интервале [a,b]:
,
используя одну из трех квадратурных формул:
1. прямоугольников;
2. трапеций;
3. парабол.
Сравнить результаты вычислений для различных чисел разбиений интервала n
Исходные данные:
f (x) |
a |
b |
№ формулы |
n1 |
n2 |
|
3 |
4 |
2 |
8 |
16 |
Метод трапеций:
Структура программы:
1. Подключение библиотек
2. Описывание данной функции
3. Описание функции I для вычисления интеграла
4. Создание виджетов
1.1. Создание окна
1.2. Описание в окне буквенных обозначений
1.3. Создание полей для введения пользователем a, b, n
1.4. Создание полей для введения пользователем a, b, n
1.5. Создание кнопок
1.6. Отображение главного окна
Код программы:
# * - coding: utf-8 - *-
from math import*
from Tkinter import*
def f (x):
F= (1+x**2) / (1+x**3)
return F
def I ():
k=0.0
a = float (a_entry. get ())
b = float (b_entry. get ())
n = int (n_entry. get ())
h= (b-a) /n
for i in range (0,n-1):
p=2*f (a+ (i+1) *h)
k=k+p
I=h/2* (f (a) +k+f (b))
I= '%.6f' % I
z2_label. configure (text=I)
#
root = Tk () # создание окна
root. title ("Задание № 3")
frame = Frame (root)
frame. pack ()
# создание виджетов
t1_label = Label (frame, bg='green', text="Вычисление определенного интеграла \nс использованием численного метода трапеций", font='arial 10')
t1_label. grid (row=0, column=0, columnspan=3,pady=15,padx=15) # размещение виждета в окне
t2_label = Label (frame, text="a - нижний предел интегрирования")
t2_label. grid (row=2, column=0, columnspan=3, sticky=W,padx=10)
t3_label = Label (frame, text="b - верхний предел интегрирования")
t3_label. grid (row=3, column=0, columnspan=3, sticky=W,padx=10)
t4_label = Label (frame, text="n - число разбиений отрезка интегрирования")
t4_label. grid (row=4, column=0, columnspan=3, sticky=W,padx=10)
t5_label = Label (frame, text="z - результат интегрирования")
t5_label. grid (row=5, column=0, columnspan=3, sticky=W,padx=10)
t6_label = Label (frame, text="Введите данные для расчёта:", font='arial 8')
t6_label. grid (row=6, column=0, columnspan=3, sticky=W, pady=5,padx=10)
#
a_label = Label (frame, text="a=")
a_label. grid (row=7, column=0,pady=5)
a_entry = Entry (frame, width=10)
a_entry. grid (row=7, column=1,pady=5)
#
b_label = Label (frame, text="b=")
b_label. grid (row=8, column=0,pady=5)
b_entry = Entry (frame, width=10)
b_entry. grid (row=8, column=1,pady=5)
#
n_lebel = Label (frame, text="n=")
n_lebel. grid (row=9, column=0,pady=5)
n_entry = Entry (frame, width=10)
n_entry. grid (row=9, column=1,pady=5)
#
z1_label = Label (frame, text="z=")
z1_label. grid (row=10, column=0,pady=5)
z2_label = Label (frame, bg='white', text="?",width=10)
z2_label. grid (row=10, column=1,pady=5)
#
eval_button = Button (frame,bg='green', text="Вычислить", width=10, command=I)
eval_button. grid (row=11, column=0,sticky=W, pady=10,padx=15)
exit_button = Button (frame, bg='grey', text="Выйти", width=10, command=root. destroy)
exit_button. grid (row=11, column=1, padx=10,pady=10)
#
canvas1 = Canvas (frame, width =160, height=60)
img = PhotoImage (file='. /3. gif')
canvas1. create_image (90, 35, image=img, anchor=CENTER)
canvas1. grid (row=1, column=0,columnspan=3, sticky=N+S, pady=5,padx=2)
root. mainloop ()
Результат решения:
Вывод:
По заданному выражению аналитической функции f (x) = был вычислен приближенно определенный интеграл от этой функции на заданном интервале [a,b]. Было выяснено, что от количества разбиений "n" зависит точность решения. Чем число разбиений больше, тем выше точность измерений.
4. Численное решение нелинейных уравнений с заданной точностью
Постановка задачи:
По заданному нелинейному уравнению F (x) =0,где F (x) - некоторое нелинейное аналитическое выражение, определенное на интервале [a, b], вычислить корни этого уравнения с требуемой точностью E одним из трех методов:
1. итераций;
2. половинного деления;
3. Ньютона.
Проверяется, имеет ли место перемена ее знака (переход через нуль) на интервале [a, b].
Исходные данные:
F (x) |
a |
b |
Метод |
Точность |
|
1.2 |
6 |
3 |
0.000001 |
Метод Ньютона (касательных) основан также на последовательном задании значений x и вычислении функции F (x), причем очередное значение x определяется формулой:
x (n+1) =x (n) - F (x (n)) /F' (x (n)),
где F' (x (n)) - производная от функции F (x) в точке x (n).
Геометрически производная от F (x), как известно, по величине равна тангенсу угла наклона касательной к кривой F (x) в точке x. Тогда точка x (n+1) есть точка пересечения с осью абсцисс касательной к кривой F (x), проведенной в точке x=x (n). См. рис.5.
Рис. 5. Геометрическое представление метода Ньютона
Как и в методе итераций, начальное значение x задается как ближайшее табличное к месту перехода функции F (x) через нуль.
Выражение для производной F' (x) получают аналитически в результате дифференцирования функции F (x). Значение производной может быть получено приближенно и численным методом:
F' (x) = (F (x+E) - F (x)) /E.
Итерационный процесс приближения к корню (последовательное вычисление x (n+1)) продолжается до тех пор, пока будет выполняться условие
|x (n+1) - x (n) |>=E.
Структура программы:
1. Подключение библиотек
2. Описание данной функции
3. Описание функции R и calculate для вычисления корня уравнения
4. Создание виджетов
4.1. Создание окна
4.2. Создание кнопок и полей для введения пользователем значений
4.3. Вставка рисунка
4.4. Создание графика исходной функции
4.5. Отображение главного окна
Код программы:
# * - coding: utf-8 - *-
# импорт математической библиотеки
from math import *
# подключение библиотеки Tkinter
from Tkinter import *
# описание функций
def F (x):
return x**3-5*x**2+3*x-2
def F1 (x):
return 3*x**2-10*x+3
def R (a,b,e,n):
h= (b-a) /float (n)
P= []
for i in range (n+1):
P. append (F (a+h*i))
T= []
for i in range (1,len (P)):
if (P [i-1] >0 and P [i] <0) or (P [i-1] <0 and P [i] >0):
if (abs (P [i-1]) - 0) <= (abs (P [i]) - 0):
T. append (P [i-1])
else:
T. append (P [i])
if len (T) ==0:
t1_lebel = Label (frame, text="Решений нет")
t1_lebel. grid (row=7, column=1)
else:
for i in range (len (T)):
x=T [i]
x_next=x-F (x) /F1 (x)
while abs (x_next-x) >=e:
x=x_next
x_next=x-F (x) /F1 (x)
return x_next
def calculate ():
a1 = float (a1_entry. get ())
#
b1 = float (b1_entry. get ())
#
e1 = float (e1_entry. get ())
#
n1 = float (n1_entry. get ())
# использование обработки исключений. Сначала выполняется ветвь try
try:
f_x = "%11.10f" %R (a1,b1,e1,n1)
# если во время выполнения try возникает исключение,
# то дальнейшее выполнение try прекращается и выполняется ветвь except
except:
f_x = "?"
a_label. configure (text=f_x)
# создание экземпляра класса Tk, отвечающего за создание окон
root = Tk ()
# определение заголовка окна
root. title ("Задание 4")
frame = Frame (root)
frame. pack ()
t1_label = Label (frame, bg='green', text="Численное решение нелинейного уравнения \n с заданной точностью", font='arial 12')
t1_label. grid (row=0, column=0, columnspan=4, padx=5,pady=5)
# создание кнопки нижнего значения интервала
a1_entry = Entry (frame, width=10)
a1_entry. grid (row=3, column=1, padx=5,pady=5)
a1_lebel = Label (frame, text="Начало интервала")
a1_lebel. grid (row=3, column=0,padx=5,pady=5)
# создание кнопки верхнего значения интервала
b1_entry = Entry (frame, width=10)
b1_entry. grid (row=4, column=1)
b1_lebel = Label (frame, text="Конец интервала")
b1_lebel. grid (row=4, column=0)
# точность
e1_entry = Entry (frame, width=10)
e1_entry. grid (row=5, column=1)
e1_lebel = Label (frame, text="Точность: ")
e1_lebel. grid (row=5, column=0)
# Количество разбиений
n1_entry = Entry (frame, width=10)
n1_entry. grid (row=6, column=1)
n1_lebel = Label (frame, text="Количество разбиений: ")
n1_lebel. grid (row=6, column=0)
a_lebel = Label (frame, text="Корень: ")
a_lebel. grid (row=7, column=0)
a_label = Label (frame, text="?")
a_label. grid (row=7, column=1)
# создание кнопки вычисления значения интеграла
eval_button = Button (frame, bg='green',text="Вычислить", width=10,command=calculate)
eval_button. grid (row=9, column=0)
# создание кнопки закрытия приложения
exit_button = Button (frame, bg='grey',text="Выход", width=10,command=root. destroy)
exit_button. grid (row=9, column=1, padx=25,pady=15)
#
canvas1 = Canvas (frame, width =160, height=50)
img = PhotoImage (file='. /4. gif')
canvas1. create_image (90, 35, image=img, anchor=CENTER)
canvas1. grid (row=1, column=0, sticky=N+S, pady=5,padx=2)
# непосредственное создание окна
root. mainloop ()
Результат решения:
Вывод:
По заданному нелинейному уравнению =0, определенном на интервале [a, b], были вычислены корни этого уравнения с требуемой точностью E методом Ньютона.
Были взяты две произвольные точки на функции и получен отрезок, ограниченный слева и справа этими точками, задан класс точности вычислений и выяснено, что точность вычислений зависит от того, какой класс точности задать, так же было определено, что если корень не попадает в заданный нами интервал, то программа не выдает должного ответа.
5. Численное решение дифференциальных уравнений первого порядка
Постановка задачи:
С помощью численных методов решить дифференциальное уравнение первого порядка у'=f (x,y).
1. Метод Эйлера.
2. Модифицированный метод Эйлера (вариант 1).
3. Модифицированный метод Эйлера (вариант 2).
4. Метод Рунге-Кутта третьего порядка.
5. Метод Рунге-Кутта четвертого порядка
Исходные данные:
Уравнение |
Метод |
a |
b |
x0 |
y0 |
|
у'=exp (-x) - 2x |
1,4 |
1 |
2 |
1 |
1 |
1. Метод Эйлера
y1=y0+h*f (x0,y0) x1=x0+h |
Расчетные формулы для 1-го шага |
|
yi+1=yi+h*f (xi,yi) xi+1=xi*h |
Расчетные формулы для i-го шага |
2. Метод Рунге-Кутта третьего порядка
уi+1=уi+ (k1+4k2+k3) /6,k1=hf (xi, yi),
k2=hf (xi+h/2, yi+k1/2),
k3=hf (xi+h, yi+2k2-k1),
xi+1=xi+h.
Структура программы:
1. Подключение библиотек
2. Описание данной функции
3. Описание функции fx метода Эйлера
4. Описание функции rk метода Рунге-Кутта
5. Описание функции calculate для нахождения значения
6. Создание виджетов
6.1. Создание окна
6.2. Создание кнопок и полей для введения пользователем значений
6.3. Вставка рисунка
6.4. Отображение главного окна
Код программы:
# * - coding: utf-8 - *-
# подключение библиотеки Tkinter
from Tkinter import *
# импорт математической библиотеки
from math import *
# описание функции
def du (x,y):
return exp (-x) - 2*x
def fx (x_0,y_0,x_k,n_1):
# шаг интегрирования
h= (x_k-x_0) /n_1
#Метод Эйлера
for i in range (0,n_1):
y1=y_0+h*du (x_0,y_0)
x1=x_0+h
x_0=x1
y_0=y1
return y1
def rk (x_0,y_0,x_k,n_1):
h= (x_k-x_0) /n_1
# метод рунге-кутта
for i in range (0,n_1):
k1=h*du (x_0,y_0)
k2=h*du (x_0+h/2,y_0+k1/2)
k3=h*du (x_0+h,y_0+2*k2-k1)
y1=y_0+ (k1+4*k2+k3) /6
x_0=x_0+h
y_0=y1
return y1
def calculate_y1 ():
# начальные условия
x0 = float (x0_entry. get ())
y0 = float (y0_entry. get ())
# конечная точка
xk = float (xk_entry. get ())
# число разбиений
n = int (n_entry. get ())
# использование обработки исключений. Сначала выполняется ветвь try
try:
y1 = "%11.3f" % fx (x0,y0,xk,n)
y2 = "%11.3f" % rk (x0,y0,xk,n)
# если во время выполнения try возникает исключение,
# то дальнейшее выполнение try прекращается и выполняется ветвь except
except:
y1 = "?"
y2 = "?"
y1_label. configure (text=y1)
y2_label. configure (text=y2)
# создание экземпляра класса Tk, отвечающего за создание окон
root=Tk ()
# определение заголовка окна
root. title ("Задание 5")
frame = Frame (root)
frame. pack ()
t1_label = Label (frame, bg='green', text="Численное решение дифференциального уравнения первого порядка", font='arial 12')
t1_label. grid (row=0, column=0, columnspan=5, padx=25,pady=5)
# создание окна ввода величины начального значения числа X
x0_entry = Entry (frame, width=10)
x0_entry. grid (row=1, column=2,pady=5)
x0_lebel = Label (frame, text="Начальное значение X: ")
x0_lebel. grid (row=1, column=1,pady=5)
# создание окна ввода величины начального значения числа Y
y0_entry = Entry (frame, width=10)
y0_entry. grid (row=2, column=2,pady=5)
y0_lebel = Label (frame, text="Начальное значение Y: ")
y0_lebel. grid (row=2, column=1,pady=5)
# оздание окна ввода величины конечной точки
xk_entry = Entry (frame, width=10)
xk_entry. grid (row=1, column=4,pady=5)
xk_lebel = Label (frame, text="Конечное значение Х: ")
xk_lebel. grid (row=1, column=3,pady=5)
# создание окна ввода величины точности интегрирования)
n_entry = Entry (frame, width=10)
n_entry. grid (row=2, column=4,pady=5)
n_lebel = Label (frame, text="Число разбиений: ")
n_lebel. grid (row=2, column=3,pady=5)
# создание поля вывода ответа (метод эйлера)
y1_label = Label (frame, text="?")
y1_label. grid (row=3, column=1,padx=5,pady=5)
y1_lebel = Label (frame, text="Метод Эйлера: ")
y1_lebel. grid (row=3, column=0,padx=5,pady=5)
# создание поля вывода ответа (метод рунге-кутта)
y2_label = Label (frame, text="?")
y2_label. grid (row=4, column=1,padx=5,pady=5)
y2_lebel = Label (frame, text="Метод Рунге-Кутта 3го порядка: ")
y2_lebel. grid (row=4, column=0,padx=5,pady=5)
# создание кнопки вычисления значения интеграла
eval_button = Button (frame,bg='green', text="Вычислить", width=10,command=calculate_y1)
eval_button. grid (row=4, column=3,padx=5,pady=5)
# создание кнопки закрытия приложения
exit_button = Button (frame, bg='grey', text="Выход", width=10,command=root. destroy)
exit_button. grid (row=4, column=4,padx=5,pady=5)
canvas1 = Canvas (frame, width =140, height=60)
img = PhotoImage (file='. /5. gif')
canvas1. create_image (60, 40, image=img, anchor=CENTER)
canvas1. grid (row=1, column=0, sticky=N+S)
# непосредственное создание окна
root. mainloop ()
Результат решения:
Проверка аналитическим методом:
Вывод
Для решения дифференциального уравнения первого порядка были использованы выше описанные методы Рунге-Кутта и метод Эйлера. Было установлено, что метод Рунге-Кутта точнее, чем метод Эйлера в сравнении с аналитическим методом вычисления, и требует меньшего числа разбиений участка функции, для выявления результата.
Заключение
В процессе решения данных задач с помощью языка программирования Python были запрограммированы и реализованы алгоритмы численных методов решения нелинейных уравнений, дифференциальных уравнений первого порядка, интегрирования аналитически заданных функций, автоматизированы процессы расчетов и вычислений некоторых инженерно-технических задач.
Были применены полученные знания в области визуального объектно-ориентированного программирования: создание виджетов, составление вычислительных функций, применение различных электронных библиотек, добавление графических объектов, использование циклов и т.д. Данные программы включали в себя численные методы решения, построение графиков, вывод таблиц. Для решения задач были использованы функции для вычисления требуемых данных и поставленных задач.
Для упрощения работы с программами созданы диалоговые окна с необходимыми командами. Во всех программах использовались компоненты типов: label, button, text, entry, frame. В некоторых из них так же использовались canvas для создания графических объектов. Для сокращения программы использовались циклы, типа for, while. Для расположения виджетов в окне использовался менеджер grid. Для математических вычислений был задействован математический модуль math, а для визуального программирования модуль tkinter.
Список используемой литературы
1. Бизли Д. Python. Подробный справочник: Символ плюс, 2010
2. Валишев М.Г., Повзнер А.А. Курс общей физики: Лань, 2010
3. Лутц М. Изучаем Python: Символ плюс, 2011
4. Россум Г., Дрейк Ф.Л. Дж., Откидач Д.С. Язык программирования Python
5. Саммерфилд М. Программирование на Python: Санкт-Петербург, 2009
6. Соболев А.Б., Рыбалко А.Ф. Математика: Академия, 2009
7. Сузи Р.А. Язык программирования Python: ИНТУИТ, 2005
8. Чаплыгин А.Н. Учимся программировать вместе с Питоном; 2004
Размещено на Allbest.ru
Подобные документы
Расчет трансформатора питания по приближенным зависимостям. Численное решение нелинейных уравнений с заданной точностью. Расчет числовых значений и построение графиков амплитудно-частотной характеристики колебательного контура по координатам точек.
курсовая работа [120,2 K], добавлен 08.01.2016Расчет подшипников на долговечность. Решение инженерно-технических задач программными методами с использованием среды прикладного программирования Dephi. Расчет параметров зубчатого зацепления. Расчет шпилечного и винтового резьбового соединения.
курсовая работа [366,3 K], добавлен 04.06.2013Схема и основные параметры элементов цепи. Вывод системы дифференциальных уравнений. Реализация алгоритма на языке программирования высокого уровня Pascal. Решение дифференциальных уравнений в пакете MathCAD. Решение интерполяции в пакете Excel.
курсовая работа [375,4 K], добавлен 06.01.2011Решение дифференциальных уравнений с использованием классических алгоритмов численных методов Эйлера и Рунге-Кутта 4-го порядка. Команды, используемые при решении обыкновенных дифференциальных уравнений в системе вычислений. Результат работы программы.
курсовая работа [226,6 K], добавлен 05.04.2013Традиционные языки высокоуровневого программирования. Обзор методов интегрирования. Оценка апостериорной погрешности. Численное решение систем линейных уравнений. Аппроксимация функций методом наименьших квадратов. Решение дифференциальных уравнений.
методичка [6,4 M], добавлен 23.09.2010Решение нелинейных уравнений методом простых итераций и аналитическим, простым и модифицированным методом Ньютона. Программы на языке программирования Паскаль и С для вычислений по вариантам в порядке указанных методов. Изменение параметров задачи.
лабораторная работа [191,0 K], добавлен 24.06.2008Разработка интерфейса программы, обеспечивающего доступ ко всем возможностям среды структурно-визуального программирования. Реализация инструментальных средств, позволяющих связывать компоненты в единое приложение. Создание иерархии классов представления.
дипломная работа [2,3 M], добавлен 11.04.2012Суть метода Рунге-Кутта и его свойства. Решение дифференциальных уравнений первого порядка. Вычислительный блок Given/Odesolve. Встроенные функции rkfixed, Rkadapt, Bulstoer. Решения линейных алгебраических уравнений в среде MathCad и Microsoft Excel.
курсовая работа [1,1 M], добавлен 02.06.2014Восстановление математической модели задачи нелинейного программирования. Решение уравнений прямых. Метод линеаризации: понятие, особенности применения при решении задач. Нахождение точки максимума заданной функции. Решение задачи графическим методом.
задача [472,9 K], добавлен 01.06.2013Разработка проекта по вычислению корней нелинейных уравнений методом итераций, в среде программирования Delphi. Интерфейс программы и ее программный код, визуализация метода. Сравнение результатов решения, полученных в Mathcad 14 и методом итераций.
контрольная работа [1,9 M], добавлен 10.12.2010