Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отчет для Буйного(пример).doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
387.58 Кб
Скачать

Лабораторная работа №4 «Определение максимума функции одной переменной»

# -*- coding: utf-8 -*- # кодировка

from math import * # импорт математических функций

from bsc_grafik import * # импорт в папку bsc_grafik

from bsc_polinom import *

from Tkinter import * # импорт модуля Tkinter (встроенная графичес- кая библиотека)

def f(x):return x**2*sin(x) # задаем функцию

def fl(x,n,dx):

lx,ly=[],[] # определяем два пустых списка

for i in xrange(n+1): # для каждого значения переменной определяем

y=f(x) # расчет значений функции у для каждого x

lx+=[x] # добавляем значение x в список lx

ly+=[y] # добавляем значение y в список ly

x+=dx # увеличиваем значение переменной x на шаг dx

return lx,ly # возвращение значений в программу

x1,x2,e,n=0.5,5.0,0.0000001,1000 # начальная точка x1, конечная точка x2,

точность е, число разбиений n

while 1: # задание цикла

dx=(x2-x1)/n # задаем шаг

lx,ly=fl(x1,n,dx) # производим вычисления и заносим значения в

списки lx и ly

ym=max(ly) #находим максимальное значение среди y в

списке ly

ix=ly.index(ym) #находим для максим. значения ym позицию x

xm=lx[ix] #находим максимальное значение xm среди ix

if dx<=e:break #если шаг dx меньше или равно точности e , то

конец цикла

if xm-dx>x1: #проверка нахождения максимального значения

x1=xm-dx xm в интервале от х1 до х2

if xm+dx<x2:

x2=xm+dx

print x1,x2,xm,ym #вывод на печать x1,x2,xm,ym

print x1,x2,xm,ym

«Определение максимума функции 2-х переменных»

# -*- coding: utf-8 -*- # кодировка

from Tkinter import * # импорт модуля Tkinter (встроенная графическая библиотека)

from bsc_groups import * # импорт в папку bsc_groups

from math import* # импорт математических функций

def f(x1,x2): return x1**2*sin(x1)+x2**3*cos(x2) # вызов функции и возврат значения функции

def f1(xx2,x1,x2): # задание функции по 1-й переменной

S='' # создаем пустую строку

while 1: # до тех пор пока цикл принимает истинное значение, цикл будет выполняться

x=x1

dx=(x2-x1)/n # задание приращения функции

bl.L['x']=[] # пустой список, который сохранит рассчитанные данные

bl.L['y']=[]

while x<=x2: # задание цикла с условием

y=f(x,xx2)

bl.add(x=x,y=y) # заменяем в словаре текущее значение в списке

x+=dx # увеличиваем шаг на dx

ymax=max(bl.L['y']) # поиск в списке макс. значения

i=bl.L['y'].index(ymax) #определение индекса макс. значения

xmax=bl.L['x'][i] # передача значения числа с номером i в макс. значение

x1=xmax-dx

x2=xmax+dx

if (i==0) or (i==len(bl.L['y'])+1): # поиск значений по индексу в пределах границ

S='Граница'

break

print 'x11=%10.6f x12=%10.6f' % (x1,x2) # вывод значений на экран

if x2-x1<e: break # вывод макс. значения на экран при условии x2-x1<e

return xmax,x1,x2,s # возвращение значений в программу

def f2(xx1,x1,x2): # определяем функцию по второй переменной

(все описания аналогичны)

S=''

while 1:

x=x1

dx=(x2-x1)/n # шаг dx

bl.L['x']=[] # очистить метки базы данных

bl.L['y']=[]

while x<=x2: # до тех пор пока истинно условие выполняется оператор

y=f(xx1,x)

bl.add(x=x,y=y) # записать в базу данных

x+=dx # увеличиваем шаг на dx

ymax=max(bl.L['y']) # записываем ymax в соответствующую метку базы данных

i=bl.L['y'].index(ymax)

xmax=bl.L['x'][i] # записываем xmax в подготовленную метку базы данных

x1=xmax-dx # начальная точка1 интервала

x2=xmax+dx # конечная точка2 интервала

if (i==0) or (i==len(bl.L['y'])+1): # если истинно условие, то

S='Граница'

break # завершение цикла

print 'x21=%10.6f x22=%10.6f' % (x1,x2) # вывод значений на экран

if x2-x1<e: break

return xmax,x1,x2,s

x11=0.0 # задание начальных и конечных значений интервала

x12=2.0*pi

x21=0.0

x22=2.0*pi

n=100.0 # задание числа точек разбиения интервала

dx=(x2-x1)/n # вычисление приращения функции

e=0.00001 # задание точности вычислений

bl=Bl('x','y') # задаем объекты, которые будут следить за накапливанием данных

xx2=x21 # новый диапазон интервала

xn1=x11

xn2=x21

while 1: # до тех пор пока цикл принимает истинное значение, цикл будет выполняться

xx1,x11,x12,s=f1(xx2,x11,x12)

if s<>'': break # если s не принимает пустых значений, то выполняем цикл, иначе - прерываем

xx2,x21,x22,s=f2(xx1,x21,x22)

if s<>'': break # если s не принимает пустых значений, то выполняем цикл, иначе - прерываем

xmod=sqrt((xx1-xn1)**2+(xx2-xn2)**2) # нахождение модуля вектора

if xmod<e: break # сравнение модуля вектора с точностью вычислений

print 'x=%10.6f y=%10.6f' % (xmax,ymax) # вывод значений максимума функции на экран