Автор работы: Пользователь скрыл имя, 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
Сравнить результаты вычислений для
различных чисел разбиений
Для оценки правильности принятого алгоритма и составленной по нему программы интегрирования функции рекомендуется провести их проверку на решении следующей тестовой задачи:
при n=32.
f(x) |
a |
b |
№ формулы |
n1 |
n2 |
|
0 |
1 |
1 |
12 |
24 |
Метод парабол – формула:
Алгоритм
Код программы:
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-
k=k+p
pI=((h*(-f(a)+k+f(b)))/3)*1.
pI= '%.6f' % pI
z_label.configure(text=(pI))
#
root = Tk() # создание окна
root.title("Задание № 3")
frame = Frame(root)
frame.pack()
# создание виджетов
t1_label = Label(frame, text="Вычисление
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()
Результат решения:
Вывод:
По заданному выражению
Задача 4. Численное решение нелинейных уравнений с заданной точностью.
Постановка задачи. По заданному нелинейному уравнению
F(x)=0,
где F(x) – некоторое нелинейное аналитическое выражение, определенное на интервале [a, b], вычислить корни этого уравнения с требуемой точностью E одним из трех методов:
Проверяется, имеет ли место перемена ее знака (переход через нуль) на интервале [a, b].
Исходные данные.
F(x) |
a |
b |
Метод |
Точность |
|
0.4 |
0.85 |
1 |
10Е-6 |
Алгоритм
Код программы:
# -*- 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=",
#
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()
Результат решения:
Вывод:
По заданному нелинейному
Мы взяли две произвольные точки
на функции и получили отрезок, ограниченный
слева и справа этими точками,
задали класс точности вычислений и
выяснили, что точность вычислений
зависит от того какой класс точности
мы задаем
5.Задача 5. Численное
решение дифференциальных
Постановка задачи. С помощью численных методов решить дифференциальное уравнение первого порядка у'=f(x,y).
1. Метод Эйлера.
2. Модифицированный метод Эйлера (вариант 1).
3. Модифицированный метод Эйлера (вариант 2).
4. Метод Рунге-Кутта третьего порядка.
5. Метод Рунге-Кутта четвертого порядка.
Исходные данные.
Уравнение |
Метод |
у'=(1-x**2)/xy |
3,4 |
уi+1=уi+hf(xi+h/2, yi+hf(xi,yi)/2),
xi+1=xi+h.
у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.
Алгоритм:
Код программы:
# *- 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*
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:
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="Численное
решение дифференциальных
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()
Результат решения:
Вывод
Для решения дифференциального
уравнения первого порядка мы
используем выше описанные методы Рунге-Кутта
и модифицированный метод Эйлера,
стоит отметить, что метод Эйлера точнее
чем метод Р.-К., и требует меньшего числа
разбиений участка функции, для получения
результата.
Заключение.
В процессе решения данных задач
с помощью языка
Были применены полученные знания
в области визуального
Для упрощения работы с
программами созданы