Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 07.11.2012, 02:11   #1 (permalink)
Jloku
Новичок
 
Регистрация: 07.11.2012
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
Question Решение кубического уравнения методом хорд, Python

Добрый день
Решаю лабораторную работу по числовым методам.
Столкнулся с такой проблемой:
Функции для нахождения корней работают, а вот функция для нахождения промежутков - нет, не смотря на то, что согласно словам преподавателя, она должна работать. Код прокомментирован, проблемная функция выделена. Посоветуйте, пожалуйста, как ее заменить/изменить


Код:
# -*- coding: cp1251 -*-

#Нужная нам функция#
def fun(x):
return float(x**3 + 4*(x**2) - 19*x + 14)

#Формула для метода хорд#
def promice(a,b):
return a+(fun(b)*(b-a))/(fun(b)-fun(a))

#Функция для подбора промежутков (!) НЕРАБОЧАЯ (!)#
def found():
#Cписок для хранения промежутков#
loop = []

for i in range(-1000, 1000, 1 ):
if float(fun(i)) * float(fun(i - 1)) < 0:
loop.append(i)
return loop


#Функция, которая находит корни уравнения#
def root(a, b, eps):
while abs(b-a) > eps:
a = promice(a,b)
b = promice(b,a)
loot = b
return loot

#Функция, которая выводит на экран корни уравнения по заданным помежуткам#
def fin(eps):
print "Проводится поиск промежутков..."
loop = found()
print loop

#Переменная для "чередования" промежутков#
i = 0;

#Количество промежутков#
p = 3

##eps = float(raw_input("Epsilon: "))
while p != 0:
a = float(loop[i])
b = float(loop[i+1])
i += 2
print root(a, b, eps)

p += -1


print fin(0.01)
Jloku вне форума   Ответить с цитированием

Старый 07.11.2012, 02:11
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Данные топики могут вам очень хорошо помочь

Приближенное решение уравнения
Помогите с программой на Python
Метод хорд и бисекций
Паскаль. Найти корни уравнения методом хорд
Решение нелинейного уравнения на Паскале

Старый 07.11.2012, 03:49   #2 (permalink)
kreol
Member
 
Аватар для kreol
 
Регистрация: 27.02.2010
Сообщений: 659
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 1312
По умолчанию

Ну к примеру потому, что у вас промежуток и корни совпадают.
Корни -7, 1, 2
Ну и функция от -7, 1, 2 равна 0, а не отрицательна.
и получается, что условие надо переписать:
Код:
if float(fun(i)) * float(fun(i - 1)) <= 0:
но тогда в функции promice будет деление на ноль так как значения промежутка a и b могут содержать корни. в общем надо играться с шагом
kreol вне форума   Ответить с цитированием
Старый 07.11.2012, 04:04   #3 (permalink)
Jloku
Новичок
 
Регистрация: 07.11.2012
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Спасибо огромное, но я уже решил проблему.
Просто я забыл, как найти промежутки монотонности.
Все решается, если в функции found искать не по функции, а по ее производной.
Jloku вне форума   Ответить с цитированием
Старый 07.11.2012, 04:22   #4 (permalink)
kreol
Member
 
Аватар для kreol
 
Регистрация: 27.02.2010
Сообщений: 659
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 1312
По умолчанию

) тоже верно
kreol вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Метки
python

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 05:15.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.