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

Автор работы: Пользователь скрыл имя, 20 Ноября 2012 в 23:07, курсовая работа

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

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

Содержание работы

Введение. 3
Задача 1. Расчет трансформатора питания 4
Задача2.Расчет и построение амплитудно-частотной характеристики колебательного контура 8
Задача 3. Численное интегрирование аналитически заданной функции 12
Задача 4. Численное решение нелинейных уравнений с заданной точностью. 16
Задача 5. Численное решение дифференциальных уравнений первого порядка 21
Заключение. 25
Используемая литература: 26

Содержимое работы - 1 файл

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

— 666.50 Кб (Скачать файл)

у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. Аналитическое решение.( x0=0, y0=1, x1=1)

dy/dx=x2

y=1+x3/3,

yk=y(1)=1+1/3=4/3=1,333

Алгоритм:

 

  1. Задаем  данные – x0, y0, x, n.
  2. Указываем шаг сетки по x.
  3. Задаем функцию, рассчитывающую значение f(x) в точке (x, y) - f_x(x, y).
  4. Реализуем алгоритм метода Эйлера с помощью цикла for и полученные значения записываем в два массива - X и Y, ( X содержит список значений точек сетки по x, а Y – список значений f(x) в каждой точке сетки по x, рассчитанных по формуле Эйлера.)
  5. Реализуем алгоритм метода Рунге-Кутты 3-го порядка с помощью цикла for и полученные значения записываем в два массива - Xset и Yset, (Xset содержит список значений точек сетки по x, а Yset – список значений f(x) в каждой точке сетки по x, рассчитанных по формуле Рунге-Кутты.)
  6. Выводим результаты.

Код:

# *- coding: utf-8 -*-

# подключение библиотеки Tkinter

from Tkinter import *

# импорт математической  библиотеки

from math import *

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

def du(x,y):

    return (y*log(y))/(sin(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='wheat', text="Численное  решение дифференциальных уравнений  первого порядка y'=(y*log(y))/(sin(x))", font='arial 10')

t1_label.grid(row=0, column=0, columnspan=4, padx=5,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='red', text="Выйти", width=10,

                     command=root.destroy)

exit_button.grid(row=4, column=4,padx=5,pady=5)

# непосредственное создание  окна

root.mainloop()

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

 

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

y’=(y*log(y))/(sin(x))

dy/ylny=ylny/sinx

∫dy/ylny=∫dx/sinx

ln|lny|=ln(sin(x/2))-ln(cos(x/2))+lnc

y=ec*tg(x/2)

x0=1 y0=2

2= ec*tg(x/2)

2= ec *0.55

ec =2/0.55=3.636

c=ln3.636

c=1.290

x1=2 y= e1.29*1.557

y=3.632*1.557

y=5.65

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

Например для x0=1, x1=2, y0=2, отсюда y=5.65

 

Вывод:

Для решения дифференциального  уравнения первого порядка были использованы выше описанные методы Рунге-Кутта и метод Эйлера. Было установлено, что метод Эйлера точнее, чем метод Рунге-Кутта в сравнении с аналитическим методом вычисления, и требует меньшего числа разбиений участка функции, для выявления результата. Искомое уравнение есть функция y=ec*tg(x/2). Значение функции рассчитывается при каждом шаге.

 

Заключение.

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

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

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

Сделав вывод, можно сказать, что  вычисление таких задач с помощью  визуального объектно-ориентированного программирования является  актуальной темой, и необходимо там,где используется приближенное вычисление результатов

Курсовая работа по информатике  выполнена с полным использованием возможностей персонального компьютера при решении задач.

 

Используемая литература:

1. Марк Лутц.«Изучаем Python», 2010.

2. А. Н.Чаплыгин.«Учимся программировать вместе с Питоном», 2009.

3. Г. Россум, Д. С. Откидач и «Язык программирования Python». Невский Диалект, 2001.

4. Саммерфилд М. «Программирование на Python»: С.-Петербург, 2009.

5. М. Доусон. «Программируем на Python».—СПб.: С.-Петербург, 2012.

6. Сузи Р. А. «Python». Наиболее полное руководство. Петербург, 2002.

7. И. А. Хахаев практикум по алгоритмизации и программированию  на Python, 2009.

 


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