Автор работы: Пользователь скрыл имя, 20 Ноября 2012 в 23:07, курсовая работа
Цель работы:
1. Дальнейшее развитие и закрепление знаний основ информатики.
2. Умение решать с помощью персонального компьютера задач программными методами с возможным использованием одного из алгоритмических языков программирования.
Введение. 3
Задача 1. Расчет трансформатора питания 4
Задача2.Расчет и построение амплитудно-частотной характеристики колебательного контура 8
Задача 3. Численное интегрирование аналитически заданной функции 12
Задача 4. Численное решение нелинейных уравнений с заданной точностью. 16
Задача 5. Численное решение дифференциальных уравнений первого порядка 21
Заключение. 25
Используемая литература: 26
используя одну из трех квадратурных формул:
Сравнить результаты вычислений для
различных чисел разбиений
Для оценки правильности принятого алгоритма и составленной по нему программы интегрирования функции рекомендуется провести их проверку на решении следующей тестовой задачи:
при n=32.
Исходные данные.
Функция f(x) |
Интервал |
Формула |
Числа разбиений | ||
|
а |
b |
№ |
n1 |
n2 |
2 |
3 |
3 |
10 |
20 |
Метод парабол – формула:
В данной формуле x0=a, xn=b, h вычисляется по формуле h=(b-a)/n, y0, y1,..., yn – значения соответствующей функции f(x) в точках x0, x1, xn (xi=xi-1+h).
Алгоритм решения
.
Код:
# *- coding: utf-8 -*-
from math import *
from Tkinter import *
def integ (n1,a1,b1):
S=0
h=(1.0*(b1-a1)/n1)
def F(x):
#Z=e**x
Z=4*(log(x))*(e**x)+(x**3)
return Z
for i in range (1, n1+1):
p=F(a1+h*(i-1)+h/2)
S=S+p
v= (h*S)
return v
def calculate_p():# функция, исполняемая
при нажатии на кнопку
a = float(a_entry.get())
b = float(b_entry.get())
m = int(m_entry.get())
try:
fign = "%11.4f" % (integ(m,a,b))
except:
fign = "?"
v_label.configure(text=fign)
root = Tk() # создание окна
root.title("Задача 3")
frame = Frame(root)
frame.pack()
# создание виджетов
t1_label = Label(frame,bg='wheat', text="Численное
интегрирование аналитически
t1_label.grid(row=0, column=0, columnspan=4,padx=4,pady=3) # размещение виждета в окне
#
t11_label = Label(frame, bg='#00FFFF' , text="Введите свои данные для расчёта:", font='arial 8')
t11_label.grid(row=3, column=0, columnspan=4, sticky=W, padx=2, pady=5)
#
t2_label = Label(frame, text="Kоличесво отрезков")
t2_label.grid(row=6, column=2,columnspan=4, sticky=W, padx=2)
t3_label = Label(frame,text="Верхний предел ")
t3_label.grid(row=5, column=2,columnspan=4, sticky=W, padx=2)
t4_label = Label(frame,text="Нижний предел ")
t4_label.grid(row=4, column=2,columnspan=4,sticky=
a_label = Label(frame, text="a=")
a_label.grid(row=4, column=0, padx=60)
a_entry = Entry(frame, width=10)
a_entry.grid(row=4, column=1,sticky=W, pady=5)
#
b_label = Label(frame, text="b=")
b_label.grid(row=5, column=0,padx=5)
b_entry = Entry(frame, width=10)
b_entry.grid(row=5, column=1,sticky=W, pady=5)
m_lebel = Label(frame, text="n=")
m_lebel.grid(row=6, column=0,padx=15)
m_entry = Entry(frame, width=10)
m_entry.grid(row=6, column=1,sticky=W, pady=5)
v_label = Label(frame, width=10, text="?")
v_label.grid(row=7, column=2,padx=1,pady=5)
n2_label = Label(frame, text="Результат")
n2_label.grid(row=7, column=1, padx=2)
eval_button = Button(frame,bg='#00FF00' , text="Вычислить", width=10,
command=calculate_p)
eval_button.grid(row=8, column=1,sticky=W, pady=1)
exit_button = Button(frame,bg='red', text="Выйти", width=10,
command=root.destroy)
exit_button.grid(row=8, column=2, padx=2,pady=1)
#
canvas1 = Canvas(frame, width =160, height=80)
img = PhotoImage(file='./3.gif')
canvas1.create_image(90, 50, image=img, anchor=CENTER)
canvas1.grid(row=1, column=0)
#
root.mainloop()
Результат решения:
Вывод:
По заданным значениям нижнего, верхнего предела и числа разбиений отрезка интегрирования ,произвели вычисление определенного интеграла, по заданной формуле трапеций. Формула является приближенной. С увеличением числа n точность вычисления возрастает.
Постановка задачи. По заданному нелинейному уравнению
F(x)=0,
где F(x) – некоторое нелинейное аналитическое выражение, определенное на интервале [a, b], вычислить корни этого уравнения с требуемой точностью E одним из трех методов:
Проверяется, имеет ли место перемена ее знака (переход через нуль) на интервале [a, b].
Исходные данные
F(x) |
a |
b |
Метод |
Точность |
1 |
2 |
3 |
10-5 |
Метод Ньютона (касательных) основан также на последовательном задании значений 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.
Итерационный процесс
Следует иметь ввиду, что при выполнении задания и алгоритм, и программа должны предусматривать оба этапа работы: табулирование функции F(x) с выбором начального приближения и процесс поиска корней с заданной точностью.
Алгоритм
1. Задание исходных значений a, b, n, eps: a – левая граница интервала, b – правая граница интервала, n – число разбиений, eps – требуемая точность вычислений.
2. Задание функции вычисления f(x) в точке x – f(x).
3. Задание шага интервала h.
4. Создание цикла расчета значений f(x) в каждой точке сетки по x и формирование массива из этих значений (чтобы увидеть количество переходов через нуль).
5. Реализация с помощью цикла while алгоритма половинного деления. Цикл выполняется до тех пор, пока модуль разности a и b не станет меньше требуемого значения eps.
6. Создание окна и виджетов .
Код:
# *- coding: utf-8 -*-
from Tkinter import *
from math import *
def F(x):
return 3*x-4*(log(x))-5
def vychislit():
try:
f_x = "%11.5f" % X
except:
f_x = "?"
k1_label.configure(text=f_x)
root = Tk()
root.title("Задача 4")
frame = Frame(root)
frame.pack()
t1_label = Label(frame, bg='wheat', text=" Решение нелинейного уравнения методом Ньютона ", font='arial 14')
t1_label.grid(row=0, column=0, columnspan=80, sticky=W, padx=25, pady=15)
t3_label = Label(frame, text="3x-4log(x)-5=0", font='arial 14')
t3_label.grid(row=1, column=2, columnspan=2, sticky=W+E, padx=2)
t4_label = Label(frame, text="Заданный интервал [1,2]")
t4_label.grid(row=2, column=0, columnspan=50, sticky=W, padx=2)
t5_label = Label(frame, text="Точность E = 10^(-5)")
t5_label.grid(row=3, column=0, columnspan=50, sticky=W, padx=2)
t6_label = Label(frame, text="Количество участков разбиения n = 11")
t6_label.grid(row=4, column=0, columnspan=50, sticky=W, padx=2)
a11=Label(frame, fg='#FF00FF', text="%17s" % "x", font='arial 12')
a11.grid(row=5, column=0, pady=5, padx=5)
a12=Label(frame, fg='#FF00FF', text="%17s" % "f(x)", font='arial 12')
a12.grid(row=5, column=1, pady=5, padx=5)
#создание окна для построения графика
canvas1=Canvas(frame, width = 400, height = 240)
canvas1.grid(row=5, column=2, rowspan=12, columnspan=100, padx=10, pady=10)
canvas2=Canvas(frame, width =750, height=400,bg='white')
canvas2.grid(row=5, column=2,rowspan=10,
a=1
b=2
E=10**(-5)
n= float (10)
h=(b-a)/n
M1=[]
M2=[]
M=[M1, M2]
i=0
points=[]
while a<=b+h:
x=a
M1.append (x)
Label(frame, text="%20.2f" % M[0][i]).grid(row=6+i, column=0, padx=5, pady=5)
pp=(30+(M[0][i])*150)
points.append(pp)
M2.append(F(x))
pp=(180-(M[1][i])*150)
points.append(pp)
Label(frame, text="%20.3f" % M[1][i]).grid(row=6+i, column=1, pady=5, padx=5)
a+=h
i+=1
canvas1.create_line(points,
i=1
m=abs(M[1][0])
k=[m]
x1=M[0][0]
while i<=10:
s=abs(M[1][i])
k.append(s)
if k[i]<k[i-1]:
x1=M[0][i]
i+=1
X=x1
while abs(F(X))>=E:
X=X+(F(X)*(-1))
z1_label = Label(frame, text="Корень уравнения х =", font='arial 12')
z1_label.grid(row=15, column=2, padx=2, pady=5)
k1_label = Label(frame, width=10, bg='white', text="?")
k1_label.grid(row=15, column=3, sticky=W, padx=2,pady=5)
button = Button(frame, bg='green', text="Вычислить", width=10, command=vychislit)
button.grid(row=18, column=2, sticky=W, padx=5, pady=5)
exit_button = Button(frame, bg='red', text="Выход", width=10, command=root.destroy)
exit_button.grid(row=18, column=3, pady=5)
#создание координаты Оу
y_axe=[]
yy=(40,0)
y_axe.append(yy)
yy=(40,400)
y_axe.append(yy)
canvas2.create_line(y_axe,
canvas2.create_line(38,8,40,3,
canvas2.create_line(40,3,42,8,
canvas2.create_text(45,5,text=
#создание координаты Ох
x_axe=[]
xx=(0,20)
x_axe.append(xx)
xx=(750,20)
x_axe.append(xx)
canvas2.create_line(x_axe,
canvas2.create_line(742,18,
canvas2.create_line(742,22,
canvas2.create_text(745,35,
#
canvas2.create_text(35,13,
#создание шкалы по оси Ох
for i in range(10,32):
canvas2.create_line((-230+i*
canvas2.create_text((-230+i*
#создание шкалы по оси Оy
for i in range(14,25):
canvas2.create_line((38,(-350+
canvas2.create_text(23,-350+i*
#
canvas2.create_text(70,250,
canvas2.create_line(70,250,
canvas2.create_text(100,270,
canvas2.create_line(100,270,
canvas2.create_text(130,285,
canvas2.create_line(130,285,
canvas2.create_text(160,295,
canvas2.create_line(160,295,
canvas2.create_text(190,293,
canvas2.create_line(190,293,
canvas2.create_text(220,285,
canvas2.create_line(220,285,
canvas2.create_text(250,275,
canvas2.create_line(250,275,
canvas2.create_text(280,255,
canvas2.create_line(280,255,
canvas2.create_text(310,238,
canvas2.create_line(310,238,
canvas2.create_text(340,220,
canvas2.create_line(340,220,
canvas2.create_text(370,202,
canvas2.create_line(370,202, 720,20, fill='black')
canvas2.create_text(720,20,
canvas2.create_text(690,50,
root.mainloop()
Результат решения:
Вывод:
По заданному нелинейному
Постановка задачи. С помощью численных методов решить дифференциальное уравнение первого порядка у'=f(x,y).
1. Метод Эйлера.
2. Модифицированный метод Эйлера (вариант 1).
3. Модифицированный метод Эйлера (вариант 2).
4. Метод Рунге-Кутта третьего порядка.
5. Метод Рунге-Кутта четвертого порядка.
Исходные данные.
Уравнение |
Метод |
y'=y ln(y)/sin(x) |
1,4 |
yi+1=yi+h*f(xi,yi)
xi+1=xi*h