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

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

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

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

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

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

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

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

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

используя одну из трех квадратурных формул:

  1. прямоугольников;
  2. трапеций;
  3. парабол.

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

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

 при 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).

Алгоритм решения

  1. Задаем значения границ интервала a и b.
  2. Задаем функцию расчета значения f(x) в точке x – f_x(x).
  3. Задаем функцию, рассчитывающую интеграл от f(x) по формуле трапеций

.

  1. Задаем шаг интегрирования h
  2. Создаём  цикл расчета значения функции в каждой точке сетки по формуле трапеций.
  3. Задаем функцию  для проверки верности расчетов.
  4. Выводим результаты.

Код:

# *- 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="Численное  интегрирование аналитически заданной  функции (методом трапеций)", font='arial 12')

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=W,  padx=2)

 

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 точность вычисления возрастает.

 

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

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

F(x)=0,

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

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

Проверяется, имеет ли место перемена ее знака (переход через нуль) на интервале [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.

Итерационный процесс приближения  к корню (последовательное вычисление x(n+1)) продолжается до тех пор, пока будет выполняться условие |x(n+1)-x(n)|>=E.

Следует иметь ввиду, что при  выполнении задания и алгоритм, и  программа должны предусматривать оба этапа работы: табулирование функции F(x) с выбором начального приближения и процесс поиска корней с заданной точностью.

 

  1. Определяем начальное значение x=(a+b)/2 (как результат деления интервала [a,b] пополам).
  2. Вычисляем F(x).
  3. Если F(x)>0 и F(a)>0 или F(x)<0 и F(a)<0 (т.е. перемена знака функции F(x) не произошла), то задаем a=x (т.е. перемещаем левую границу интервала в середину), уменьшая интервал вдвое и исключая при этом левую половину, на которой либо нет корней, либо есть четное число корней, иначе задаем b=x (исключаем правую половину интервала). См. рис. 4.
  4. Проверяем условие b-a<E, если оно выполняется, то возвращаемся к п.1. с новыми значениями границ интервала, иначе заканчиваем вычисления и считаем, что последнее значение x и будет корнем уравнения с заданной точностью E.

 

Алгоритм

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,columnspan=10,padx=10,pady=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,fill="blue",smooth=1)

 

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,fill="black",width=1)

canvas2.create_line(38,8,40,3,fill="black",width=1)

canvas2.create_line(40,3,42,8,fill="black",width=1)

canvas2.create_text(45,5,text="y")

#создание координаты Ох

x_axe=[]

xx=(0,20)

x_axe.append(xx)

xx=(750,20)

x_axe.append(xx)

canvas2.create_line(x_axe,fill="black",width=1)

canvas2.create_line(742,18,747,20,fill="black",width=1)

canvas2.create_line(742,22,747,20,fill="black",width=1)

canvas2.create_text(745,35,text="x")

#

 

canvas2.create_text(35,13,text="0")

#создание шкалы по  оси Ох

for i in range(10,32):

    canvas2.create_line((-230+i*30),18,(-230+i*30,23), fill='black')

    canvas2.create_text((-230+i*30), 30,text="%.1f" % (0.1*i), font = 12)

#создание шкалы по оси Оy

for i in range(14,25):

    canvas2.create_line((38,(-350+i*30),43,(-350+i*30)), fill='black')

    canvas2.create_text(23,-350+i*30,text="%.1f" % (-0.1*i), font = 12)

 

#

canvas2.create_text(70,250,text="▲")

canvas2.create_line(70,250,100,270, fill='black')

canvas2.create_text(100,270,text="▲")

canvas2.create_line(100,270,130,285, fill='black')

canvas2.create_text(130,285,text="▲")

canvas2.create_line(130,285,160,295, fill='black')

canvas2.create_text(160,295,text="▲")

canvas2.create_line(160,295,190,293, fill='black')

canvas2.create_text(190,293,text="▲")

canvas2.create_line(190,293,220,285, fill='black')

canvas2.create_text(220,285,text="▲")

canvas2.create_line(220,285,250,275, fill='black')

canvas2.create_text(250,275,text="▲")

canvas2.create_line(250,275,280,255, fill='black')

canvas2.create_text(280,255,text="▲")

canvas2.create_line(280,255,310,238, fill='black')

canvas2.create_text(310,238,text="▲")

canvas2.create_line(310,238,340,220, fill='black')

canvas2.create_text(340,220,text="▲")

canvas2.create_line(340,220,370,202, fill='black')

canvas2.create_text(370,202,text="▲")

canvas2.create_line(370,202, 720,20, fill='black')

canvas2.create_text(720,20,text="▲")

canvas2.create_text(690,50,text="(ответ)")

 

root.mainloop()

 

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

 

 

Вывод:

По заданному нелинейному уравнению было произведено вычисление корней этого уравнения с требуемой точностью E,методом Ньютона(по условию). Было взято11 точек на функции, с помощью которых был получен график , , задан класс точности вычислений и выяснено, что точность вычислений зависит от того, какой класс точности задан.

 

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

 

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

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

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

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

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

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

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

Уравнение

Метод

y'=y ln(y)/sin(x)

1,4


 

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

      yi+1=yi+h*f(xi,yi)

xi+1=xi*h

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

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