Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 21.07.2022
Сообщений: 17

Как оптимизировать количество вычислений функции? Написать код на Python для отделения корней

03.04.2023, 10:34. Показов 1262. Ответов 1

Студворк — интернет-сервис помощи студентам
Здравствуйте! Вчера я думал, что для завершения работы над контрольной достаточно будет спросить, как вычислить порядок сходимости, но сейчас понял, что нет.

Задание - написать код на Python для отделения корней их уточнения методом дихотомии.

Входные данные:

функция f(x);
интервал [a,b];
точность по аргументу и по функции ε1 ε2.

Выходные данные:

корни ξi , точность;
значения функции f ( ξi) ;
количество итераций n;
количество вычислений функции f(x) ;
время счета;
параметр сходимости

a = |xn+1-xn|/|xn-xn-1|

Преподаватель не принял и вот что ответил:

Уточнение корней прекращается, когда обе погрешности меньше заданных значений. Не оптимизировано количество вычислений функции – не исправлено. Коэффициент сходимости вычисляется не так (см. формулу в задании). Выходных данных по-прежнему не хватает.

Насчёт строк, где alpha - это я всё ещё не могу понять, как вычислить параметр сходимости, какие переменные и как использовать.

А ещё я запутался в условиях окончания итерации.

Вот как-то так.
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
from math import *
import time
 
print('Метод дихотомии')
 
def f(x): #функция
    return 10*cos(x) - 0.1*x**2
 
def findRoot(f,a,b,eps1,eps2): #функция поиска корня
    roots = []
    count = 0 #количество вычислений функции f(x)
    c = (a+b)/2
    roots.append(c)
    n = 1 #количество итераций
    if f(c) == 0:
        count += 1
        return count,n,c,time.time() - t1,t1
    #while abs(f(c)) > eps1 and abs(b-a)/2 > eps2:
    #while a >= min(eps1,eps2) and b >= min(eps1,eps2):
    #while (b-a)/2 >= min(eps1,eps2):
        n += 1
        count += 1
        if f(a)*f(c) < 0:
            b = c
            count += 2
        else:
            a = c
        c = (a+b)/2
        roots.append(c)
    #alpha = abs(c-a)/abs(b-a) #параметр сходимости, формула взята с киберфорума
    #alpha = (log()-log())/log()
    alpha
    #https://www.cyberforum.ru/cpp-beginners/thread2816840.html
    return count,n,c,alpha
 
while True:
    a = input('Введите a')
    try:
        a = float(a)
    except:
        continue
    else:
        break
 
while True:
    b = input('Введите b')
    try:
        b = float(b)
    except:
        continue
    else:
        break
 
while True:
    eps1 = input('Введите точность по функции')
    try:
        eps1 = float(eps1)
    except:
        continue
    else:
        break
 
while True:
    eps2 = input('Введите точность по аргументу')
    try:
        eps2 = float(eps2)
    except:
        continue
    else:
        break
 
h = 0.5
 
t = time.time() #для записи времени
 
#дальше идёт отделение корней
 
x1 = a
x2 = a + h
 
while x2 <= b:
    if f(x1)*f(x2) < 0:
        count,n,root,alpha = findRoot(f,x1,x2,eps1,eps2)
        '''print('Корень',root)
        print('Функция f(x) от корня',
            f(root)
            )
        print('Количество итераций',n)
        print('Количество вычислений функции f(x)',count)
        print('Порядок сходимости',alpha)'''
    x1 = x2
    x2 = x1+h
 
print('Корень',root)
print('Функция f(x) от корня',
    f(root)
    )
print('Количество итераций',n)
print('Количество вычислений функции f(x)',count)
print('Порядок сходимости',alpha)
 
print('Время счёта (с)',time.time() - t)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.04.2023, 10:34
Ответы с готовыми решениями:

Написать программу для графического отделения действительных корней нелинейного уравнения
Уравнение x^4 +7*x^3-x+12=0 Помогите решить методом Ньютона при заданной точности E=10^-3 Метод Ньютона прикрепил картинкой

Написать программу отделения корней
Всем привет, просить крайне не удобно но все же.. Учусь на первом курсе института. дали задание по высшей математике. В паскале не силен,...

Написать программу отделения корней их уточнения одним из нижеперечисленных методов
Всем привет! Написать программу отделения корней их уточнения одним из нижеперечисленных методов (любым): а) методом дихотомии; б)...

1
29 / 19 / 10
Регистрация: 24.04.2023
Сообщений: 62
25.04.2023, 00:12
Преподаватель указал на несколько проблем в вашем коде, которые могут быть улучшены:

Оптимизация количества вычислений функции
Вычисление коэффициента сходимости
Уточнение условий окончания итерации
Недостаточное количество выходных данных

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
from math import *
import time
 
print('Метод дихотомии')
 
def f(x): #функция
    return 10*cos(x) - 0.1*x**2
 
def findRoot(f,a,b,eps1,eps2): #функция поиска корня
    count = 0 #количество вычислений функции f(x)
    c = (a+b)/2
    n = 1 #количество итераций
    while abs(b-a)/2 > max(eps1, eps2):
        count += 2
        if f(a)*f(c) < 0:
            b = c
        else:
            a = c
        c = (a+b)/2
        n += 1
    count += 1
    return c, f(c), n, count, abs(c-a)/(b-a) # возвращаем корень, значение функции в корне, количество итераций, количество вычислений f(x), и коэффициент сходимости
 
t1 = time.time() # для записи времени
 
while True:
    try:
        a = float(input('Введите a: '))
        b = float(input('Введите b: '))
        eps1 = float(input('Введите точность по функции: '))
        eps2 = float(input('Введите точность по аргументу: '))
    except ValueError:
        print('Неверный формат ввода, попробуйте еще раз')
    else:
        break
 
h = 0.5
 
roots = []
 
x1 = a
x2 = a + h
 
while x2 <= b:
    if f(x1)*f(x2) < 0:
        root, value, n, count, alpha = findRoot(f, x1, x2, eps1, eps2)
        roots.append((root, value, n, count, alpha))
    x1 = x2
    x2 = x1+h
 
for root, value, n, count, alpha in roots:
    print('Корень:', root)
    print('Значение функции f(x) в корне:', value)
    print('Количество итераций:', n)
    print('Количество вычислений функции f(x):', count)
    print('Порядок сходимости:', alpha)
    print()
 
print('Время счёта (с):', time.time() - t1)
Обновленный код устраняет ошибки и вычисляет коэффициент сходимости в соответствии с формулой из задания. Также он оптимизирует количество вычислений функции, вычисляет все необходимые данные и уточняет условия окончания итерации.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.04.2023, 00:12
Помогаю со студенческими работами здесь

Как правильно написать (оптимизировать) код для меню?
Есть менюшка из заголовков, сам список выежает при нажатии на заголовок (метод .slideToggle ). Назначил каждому списку и заголовку свои...

Написать код функции на Python для проверки соответствий
Пользователь должен ввести Время в формате HH:MM(:SS), а программа проверить на соответствие

Разработка программы для отделения корней аналитически и уточнения одного методом хорд с точностью до 0.001
Помогите срочно, в моём училище не было паскаля уже как год и дали курсач по нему, а сам на вэб перешёл для себя: Разработка программы...

Написать код уточнения значения корня (корней) функции комбинированным методом хорд и секущих
Здравствуйте, надо написать код уточнения значения корня(корней) функции( x^3 - 6x + 3 ) комбинированным методом хорд и секущих, пытался...

Построить график функции f (x); Определить количество корней и их примерное значение или диапазоны поиска корней
Здравствуйте! Посмотрите, пожалуйста, в чем мои ошибки (ругается на 3-ю и 4-ю строки). Задание, в общем, таковое: 1) Построить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru