2013-11-28 4 views
0

Я хочу запустить через две функции Р (х) и г (х) при х = 0 до 1000Как округлить вверх/вниз плавает

Моя цель состоит в том, чтобы найти какое значение х делает е и g перехват.

Итак, while f(x) != g(x) Я хочу продолжать работать.

Когда f(x) = g(x) Я хочу, чтобы цикл остановился и возвращал это значение x.

My problem:

х не обязательно является целым числом. На самом деле, в моем случае, мне приходится иметь дело со многими десятичными знаками.

Есть ли разумный способ определить приблизительное значение поплавка x, которое допускает некоторую ошибку?

Спасибо!

+3

Вы пытаетесь найти значение 'x', которое делает' f (x) - g (x) == 0'. Поэтому вам нужен [алгоритм поиска корней] (http://en.wikipedia.org/wiki/Root_finding). –

+0

Проверьте http://stackoverflow.com/questions/5595425/what-is-the-best-way-to-compare-floats-for-almost-equality-in-python. – Danstahr

+0

В какой момент вы хотите объединить 'x': перед переходом в' g() 'и' f() '; для последующей обработки; для отображения пользователю? – jonrsharpe

ответ

1

Используйте функцию round и преобразовать его в целочисленном использования

>>> int(round(2.56)) 
3 

Или вы могли бы использовать Decimal модуль:

from decimal import * 

getcontext().prec = 5 

x = Decimal(22)/ Decimal(7) 
print x 
#3.1429 

В этом примере вы можете иметь точность 5 знаков после запятой как вы назначили, getcontext().prec до 5

2

Если вы хотите сравнить возврат от f(x) и g(x) в пределах некоторого допуска, вы могли бы сделать:

if abs(f(x) - g(x)) < tolerance: 

вместо

if f(x) == g(x): 
+0

Хотя это полностью верно для сравнения с плавающей точкой в ​​целом и метода, который я использую; Я считаю, что это не подходит для заявления, заданного вопросом. –

1

Если вы хотите найти перехватов, сравнивающие f(x) к g(x) это плохой способ сделать это, потому что всегда возможность того, что изменение между соседними шагами будет слишком большим для обнаружения в пределах вашего допуска или настолько маленького, что вы найдете множество перехватов, где вы должны их найти.

Вместо этого вы должны искать точки, где относительное положение f(x) и g(x) изменений, то есть на стадии, когда она переходит из f(x) >= g(x) в f(x) < g(x) или наоборот. Отслеживание предыдущего состояния должно позволить вам найти все точки перехвата.

(NB: это предполагает, как f(x) и g(x) являются непрерывной функцией, так как с разрывными функциями ее возможными для них реверса позиции без перехвата)

И, конечно, вы хотите сделать это в лучшем виде , вам лучше использовать один из многих существующих и проверенных численных root-finding algorithms.

+0

Это интересно! Интересно, как бы вы пошли на уменьшение размера приращения? Чтобы получить достаточно точные ответы, мне нужно спуститься до шага размером 0,0001. При повторении от 0 до 1000 это означает 10 000 000 шагов ... Должен ли я создать оператор if, который уменьшает шаг в соответствующей области? – tore

+0

Я бы создал функцию, которая будет перебирать между двумя точками с заданным размером шага. Когда вы обнаружите перехват на конечном шаге, вы можете снова вызвать функцию с позицией до и после изменения в качестве ее конечных точек и меньшим шагом, чтобы сузить точную область. –

+1

ах, интересно! Я закончил, однако, чтобы использовать Ньютона. Кажется, это трюк, но мне нравится твоя идея! – tore

Смежные вопросы