Решение инженерно-технологических задач с использованием средств визуального программирования

Автор работы: Пользователь скрыл имя, 08 Декабря 2013 в 08:24, курсовая работа

Краткое описание

Цель работы:
1.Дальнейшее развитие и закрепление знаний основ информатики.
2. Умение решать с помощью персонального компьютера задач программными методами с возможным использованием одного из алгоритмических языков программирования.
3. Реализация поставленных инженерно-технических задач на персональном компьютере с помощью средств визуального Python .программирования, а именно средствами языка программирования

Содержание

Введение …………………………………………………………………………………………
3
1. Задача 1. Расчет трансформатора питания…………………………………………………….
4
2. Задача 2. Расчет и построение амплитудно-частотной характеристики колебательного контура. ……………………………………………………………………………………………
8
3. Задача 3. Численное интегрирование аналитически заданной функции …………………
11
4. Задача 4. Численное решение нелинейных уравнений с заданной точностью …………….
15
5.Задача 5. Численное решение дифференциальных уравнений первого порядка. …………
18
Заключение………………………………………………………………………………………...
19

Вложенные файлы: 1 файл

отчёт по курсовой работе.doc

— 479.00 Кб (Скачать файл)
  1. прямоугольников;
  2. трапеций;
  3. парабол.

Сравнить результаты вычислений для  различных чисел разбиений интервала  n.

Для оценки правильности принятого  алгоритма и составленной по нему программы интегрирования функции  рекомендуется провести их проверку на решении следующей тестовой задачи:

 при n=32.

 

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

f(x)

a

b

№ формулы

n1

n2

0

1

1

12

24


Метод парабол – формула:

Алгоритм

  1. Подключение библиотек.
  2. Создание функции I вычисляющей интеграл по формуле.
  3. Создание окна.
  4. Размещение виджетов в окне.
  5. Отображение окна.

 

Код программы:

 

   from math import*

from Tkinter import*

def f(x):

    F=((exp(cos(x)))*sin(x))

    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(1,n/2):

        p=4*f(a+(i-1)*2*h+h)+2*f(a+(i-1)*2*h)

        k=k+p

    pI=((h*(-f(a)+k+f(b)))/3)*1.222

    pI= '%.6f' % pI

    z_label.configure(text=(pI))

#

root = Tk()             # создание окна

root.title("Задание № 3") 

frame = Frame(root)

frame.pack()

# создание виджетов

t1_label = Label(frame, text="Вычисление определенного  интеграла с использованием\n численного  метода парабол", font='arial 10')

t1_label.grid(row=0, column=0, columnspan=4, padx=25,pady=15) # размещение виждета в окне

t2_label = Label(frame, text="a - нижний предел интегрирования")

t2_label.grid(row=1, column=0, columnspan=4, sticky=W, padx=2)

t3_label = Label(frame, text="b - верхний предел интегрирования")

t3_label.grid(row=2, column=0, columnspan=4, sticky=W, padx=2)

t4_label = Label(frame, text="n - число разбиений  отрезка интегрирования")

t4_label.grid(row=3, column=0, columnspan=4, sticky=W, padx=2)

t5_label = Label(frame, text="z - результат интегрирования")

t5_label.grid(row=4, column=0, columnspan=4, sticky=W, padx=2)

 

t11_label = Label(frame, text="Введите свои  данные для расчёта:", font='arial 8')

t11_label.grid(row=10, column=0, columnspan=4, sticky=W, padx=2, pady=5)

#

a_label = Label(frame, text="a=")

a_label.grid(row=11, column=0, padx=5)

a_entry = Entry(frame, width=10)

a_entry.grid(row=11, column=1,sticky=W, pady=5)

#

b_label = Label(frame, text="b=")

b_label.grid(row=12, column=0,padx=5)

b_entry = Entry(frame, width=10)

b_entry.grid(row=12, column=1,sticky=W, pady=5)

#

n_lebel = Label(frame, text="n=")

n_lebel.grid(row=13, column=0)

n_entry = Entry(frame, width=10)

n_entry.grid(row=13, column=1,sticky=W, pady=5)

#

z_label = Label(frame, text="результат")

z_label.grid(row=13, column=2)

#

eval_button = Button(frame, text="Вычислить", width=10,

                    command=I, padx=10)

eval_button.grid(row=16, column=0,sticky=W, pady=10)

exit_button = Button(frame, text="Выйти", width=10,

                     command=root.destroy)

exit_button.grid(row=16, column=1, padx=10,pady=10)

#

canvas1 = Canvas(frame, width =160, height=80)

img = PhotoImage(file='./3.gif')

canvas1.create_image(90, 50, image=img, anchor=CENTER)

canvas1.grid(row=5, column=0)

 

root.mainloop()

 

 

Результат решения:

 

 

           

 

 

Вывод:

 

По заданному выражению аналитической  функции  я вычислил приближенно определенный интеграл от этой функции на заданном интервале [1,2]. От количества разбиений “n” зависит точность решения. Чем число разбиений больше, тем выше точность измерений.

 

 

 

 

Задача 4. Численное решение нелинейных уравнений с заданной           точностью.

Постановка  задачи. По заданному нелинейному уравнению

F(x)=0,

где F(x) – некоторое нелинейное аналитическое выражение, определенное на интервале [a, b], вычислить корни этого уравнения с требуемой точностью E одним из трех методов:

  1. итераций;
  2. половинного деления;
  3. Ньютона.

Проверяется, имеет ли место перемена ее знака (переход через нуль) на интервале [a, b].

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

 

F(x)

a

b

Метод

Точность

0.4

0.85

1

10Е-6




 

 

 

 

Алгоритм

  1. Подключение библиотек.
  2. Создаем функцию F и calc для вычисления уравнения.
  3. Создание окна.
  4. Размещение виджетов в окне.
  5. Отображение окна.

 

Код программы:

 

# -*- coding: utf-8 -*-

from math import*

from Tkinter import*

y=0

a=0.4

b=0.85

e=10**(-6)

def F(p) :

    y=x-(1/(3+sin(3.6*x))) 

    return y

x=(a+b)/2

while (b-a>e):

    if (F(x)*F(a)>0):

        a=(a+b)/2

    else:

        b=(a+b)/2

    z=x

    x=(a+b)/2

z='%.5f' % z

def calc():

    a=float(a_entry.get())

    #a='%.5f' % a

    b=float(b_entry.get())

    #b='%.5f' % b

    x=(a+b)/2

    while (b-a>e):

        if (F(x)*F(a)>0):

            a=(a+b)/2

        else:

            b=(a+b)/2

        z=x

        x=(a+b)/2

    z='%.2f' % z

    z_label.configure(text=("z=",z))

#

root = Tk()           

root.title("Задание №4") 

frame = Frame(root)

frame.pack()

#

t1_label = Label(frame, text="Численное решение  нелинейных уравнений \n с заданной  точностью", font='arial 10')

t1_label.grid(row=0, column=0, columnspan=4, padx=25,pady=15)

t2_label = Label(frame, text="a - начало интервала")

t2_label.grid(row=1, column=0, columnspan=4, sticky=W, padx=2)

t3_label = Label(frame, text="b - конец интервала")

t3_label.grid(row=2, column=0, columnspan=4, sticky=W, padx=2)

t4_label = Label(frame, text="E - точность вычисления")

t4_label.grid(row=3, column=0, columnspan=4, sticky=W, padx=2)

t7_label = Label(frame, text="E=0,000001")

t7_label.grid(row=6, column=0, columnspan=4, sticky=W, padx=2)

t11_label = Label(frame, text="Введите данные", font='arial 8')

t11_label.grid(row=9, column=0, columnspan=4, sticky=W, padx=2, pady=5)

#

a_label = Label(frame, text="a=")

a_label.grid(row=10, column=0, padx=5)

a_entry = Entry(frame, width=10)

a_entry.grid(row=10, column=1,sticky=W, pady=5)

#

b_label = Label(frame, text="b=")

b_label.grid(row=11, column=0,padx=5)

b_entry = Entry(frame, width=10)

b_entry.grid(row=11, column=1,sticky=W, pady=5)

#

z_label = Label(frame, text="?")

z_label.grid(row=11, column=2)

#

eval_button = Button(frame, text="Вычислить", width=10,command=calc, padx=10)

eval_button.grid(row=13, column=0,sticky=W, pady=10)

exit_button = Button(frame, text="Выйти", width=10,command=root.destroy)

exit_button.grid(row=13, column=2, padx=10,pady=10)

#

canvas1 = Canvas(frame, width =200, height=80)

img = PhotoImage(file='./4.gif')

canvas1.create_image(100, 70, image=img, anchor=CENTER)

canvas1.grid(row=7, column=1) # sticky=N+S)

#

root.mainloop()

 

 

 

 

 

 

 

 

 

 

 

 

Результат решения:

 

 

 

 

 

 

 

Вывод:

По заданному нелинейному уравнению  определенному на интервале [0.8, 1]  я вычислил корни этого уравнения с требуемой точностью E методом половинного деления.

Мы взяли две произвольные точки  на функции и получили отрезок, ограниченный слева и справа этими точками, задали класс точности вычислений и  выяснили, что точность вычислений зависит от того какой класс точности мы задаем 

5.Задача 5. Численное  решение дифференциальных уравнений  первого порядка

Постановка  задачи. С помощью численных методов решить дифференциальное уравнение первого порядка у'=f(x,y).

1. Метод Эйлера.

2. Модифицированный метод Эйлера (вариант 1).

3. Модифицированный метод Эйлера (вариант 2).

4. Метод Рунге-Кутта третьего порядка.

5. Метод Рунге-Кутта четвертого  порядка.

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

Уравнение

Метод

у'=(1-x**2)/xy

3,4


 

 

 

  1. Модифицированный метод Эйлера (вариант 2).

уi+1i+hf(xi+h/2, yi+hf(xi,yi)/2),

xi+1=xi+h.

  1. Метод Рунге-Кутта третьего порядка.

   у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. Создание окна
  7. Создание кнопок и полей для введения пользователем значений
  8. Вставка рисунка
  9. Отображение главного окна

 

Код программы:

 

# *- coding: utf-8 -*-

from Tkinter import *

from math import *

# описание функции

def func(x,y):

    return (1-x**2)/(x*y)

 

def fx(x_i,y_i,x_k,n_1):

# шаг интегрирования

    h=(x_k-x_i)/n_1

#Модифицированный метод эйлера (В-2)

    for i in range (0,n_1):

        y1=y_i+h*func(x_i+(h/2),y_i+h*func(x_i,y_i)/2)

        x1=x_i+h

        x_i=x1

        y_i=y1

    return y1

 

def rk(x_i,y_i,x_k,n_1):

    h=(x_k-x_i)/n_1

# метод рунге-кутта

    for i in range (0,n_1):

        k1=h*func(x_i,y_i)

        k2=h*func(x_i+h/2,y_i+k1/2)

        k3=h*func(x_i+h,y_i+2*k2-k1)

        y1=y_i+(k1+4*k2+k3)/6

        x_i=x_i+h

        y_i=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)

   

root=Tk()

 

root.title("задача 5")

frame = Frame(root)

frame.pack()

 

t1_label = Label(frame, bg='lightyellow', text="Численное  решение дифференциальных уравнений  первого порядка", font='arial 10')

t1_label.grid(row=0, column=1, columnspan=4, padx=25,pady=15)

 

x0_entry = Entry(frame, bg="lightblue", width=10)

x0_entry.grid(row=2, column=0)

x0_lebel = Label(frame, text="Начальное значение X")

x0_lebel.grid(row=1, column=0)

 

y0_entry = Entry(frame, bg="lightblue", width=10)

y0_entry.grid(row=2, column=1)

y0_lebel = Label(frame, text="Начальное значение Y")

y0_lebel.grid(row=1, column=1)

 

xk_entry = Entry(frame, bg="lightblue", width=10)

xk_entry.grid(row=2, column=2)

xk_lebel = Label(frame, text="Конечное значение Х")

xk_lebel.grid(row=1, column=2)

 

n_entry = Entry(frame, bg="lightblue", width=10)

n_entry.grid(row=2, column=3)

n_lebel = Label(frame, text="Число разбиений")

n_lebel.grid(row=1, column=3)

 

y1_label = Label(frame, text="?")

y1_label.grid(row=5, column=1)

y1_lebel = Label(frame, text="Модифицированный метод Эйлера (вариант 2)")

y1_lebel.grid(row=4, column=1)

#

y2_label = Label(frame, text="?")

y2_label.grid(row=5, column=2)

y2_lebel = Label(frame, text="Метод Рунге-Кутта  третьего порядка")

y2_lebel.grid(row=4, column=2)

#

eval_button = Button(frame, text="Вычислить", width=10,

                     command=calculate_y1)

eval_button.grid(row=8, column=0)

#

exit_button = Button(frame, text="Выход", width=10,

                     command=root.destroy)

exit_button.grid(row=8, column=3)

#

canvas1 = Canvas(frame, width =200, height=80)

img = PhotoImage(file='./5.gif')

canvas1.create_image(90, 50, image=img, anchor=CENTER)

canvas1.grid(row=3, columnspan=2)

#

root.mainloop()

 

 

 

 

 

 

 

 

 

Результат решения:

 

 

 

 

 

Вывод

Для решения дифференциального  уравнения первого порядка мы используем выше описанные методы Рунге-Кутта  и модифицированный метод Эйлера, стоит отметить, что метод Эйлера точнее чем метод Р.-К., и требует меньшего числа разбиений участка функции, для получения результата. 
Заключение.

В процессе решения данных задач  с помощью языка программирования Python были запрограммированы и реализованы алгоритмы численных методов решения нелинейных уравнений, дифференциальных уравнений первого порядка, интегрирования аналитически заданных функций, автоматизированы процессы расчетов и вычислений некоторых инженерно-технических задач.

Были применены полученные знания в области визуального объектно-ориентированного  программирования. Данные программы  включали в себя численные методы решения, построение графиков, вывод  таблиц. Для решения задач были использованы функции для вычисления требуемых данных и поставленных задач.

 Для упрощения работы с  программами созданы диалоговые  окна с необходимыми командами.  Во всех программах использовались  компоненты типов: label, button, text, entry, frame. В некоторых из них так же  использовались canvas для создания графических объектов, и scrollbar создания элементы с текстовыми значениями.  Для сокращения программы использовались циклы, типа for, while. Так же использовался менеджер grid. Для математических вычислений был задействован математический модуль math, а для визуального программирования  модуль tkinter.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Информация о работе Решение инженерно-технологических задач с использованием средств визуального программирования