Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 16.02.2012
Сообщений: 51
1

Неточности вычислений

05.04.2012, 12:21. Показов 1906. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Ситуация такова, что начал замечать что в некоторых расчетах, в которых должен получаться аккуратно ноль, вместо нуля возникает малое но ненулевое значение порядка 10-13—10-16.
С чем это связано, это мой косяк или особенности пайтоновских вычислений?Как с этим бороться?(Занимаюсь такого рода расчетами что такие величины могут играть роль).
Для примера привожу код, в котором заметил такое:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
def gauss1(array):
    for k in range(0, len(array)-1):
        for i in range(k+1, len(array)):
            lam = array[i][k]/array[k][k]
            for j in range(k, len(array[i])):
                array[i][j] = array[i][j]-lam*array[k][j]
    for k in range(len(array)-1, 0, -1):
        for i in range(k-1, -1, -1):
            if array[k][k]!=0:
                lam = array[i][k]/array[k][k]
                for j in range(len(array[i])):
                    array[i][j] = array[i][j]-lam*array[k][j]
rerurn array
Данная функция приводит матрицу к диагональному виду, вызвав ее для матрицы:
15 -3 8 12
2 5 -2 21
-5 16 2 2
Получаем результат вида:
Python
1
[[15.0, -4.440892098500626e-16, 8.881784197001252e-16, 45.64606741573033], [0.0, 5.4, 0.0, 8.261797752808986], [0.0, 0.0, 13.185185185185183, -47.888888888888886]]
Как видим, вместо нулей на месте второго и третьего членов первой строки имеем эти самые малые ненулевые значения.

Python 2.7.2, если что.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.04.2012, 12:21
Ответы с готовыми решениями:

Неточности в коде,что не так?
s1= maximum1=max(s1) print(maximum1) s2= maximum2=max(s2) print(maximum2) Этот код вроде...

Распараллеливание вычислений
У меня написана программа (Метод Монте-Карло). Что лучше всего использовать, чтобы уменьшить...

Результаты вычислений
Ребят, создала две модели не получается их нормально про интерпретировать. Помогите пожалуйста! ...

точность вычислений
Известно что в Питоне: 1.001 + 5 = 6.0009999999999994 А хочется чтобы было 6.001 ...

4
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
05.04.2012, 15:45 2
you_fail_me, это не проблема питона, это особенность представления чисел с плавающей точкой в компьютере (вкратце — произвольное вещественное число невозможно абсолютно точно отобразить в данном представлении). Так что можешь смело считать такие числа за ноль.
1
0 / 0 / 0
Регистрация: 16.02.2012
Сообщений: 51
05.04.2012, 15:55  [ТС] 3
А можно какуюто ссылку на подробное изложение данного нюанса? Каков «нулевой порог»?
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
05.04.2012, 15:56 4
Можно начать отсюда: http://ru.wikipedia.org/wiki/Ч... ей_запятой
0
0 / 0 / 0
Регистрация: 16.02.2012
Сообщений: 51
07.04.2012, 21:37  [ТС] 5
Прошу прощения, т.к. это наверное будет полуоффтоп, но хочу задать вопрос, а ради него както не очень хочется создавать еще одну тему — дописывал код, приведенный в начале темы, как я уже и говорил он приводит матрицу к диагональному виду, хотел дописать его до состояния решения матрицы методом Гаусса, для этого, как известно, после сведения к диагональному виду необходимо всего лишь разделить все элементы каждой строки на единственный ее ненулевой элемент, не являющийся свободным членом, и после этого собственно столбец свободных членов будет являться столбцов искомых неизвестных. Попытался написать это так:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def gauss1(array):
    for k in range(0, len(array)-1):
        for i in range(k+1, len(array)):
            lam = array[i][k]/array[k][k]
            for j in range(k, len(array[i])):
                array[i][j] = array[i][j]-lam*array[k][j]
    for k in range(len(array)-1, 0, -1):
        for i in range(k-1, -1, -1):
            if array[k][k]!=0:
                lam = array[i][k]/array[k][k]
                for j in range(len(array[i])):
                    array[i][j] = array[i][j]-lam*array[k][j]
    for i in range(len(array)):
        for j in range(len(array[i])):
            array[i][j] = array[i][j]/array[i][i]
    return array
Но результат получился не таким, каким его хотелось бы видеть — почему-то не изменяет свободные члены, и после обработки этой функцией такой же исходной матрицы, какая приводилась в начале темы получается результат:
Python
1
[[1.0, -4.440892098500626e-16, 0.0, 4.851017441860465], [0.0, 1.0, 0.0, -1.2675872093023255], [-0.0, -0.0, 1.0, 4.716049382716049]]
Подскажите, пожалуйста, чем это вызвано, что я делаю не так. Буду очень признателен.

Добавлено через 18 минут
Понимаю, что можно сделать проще и чтоб работало, например, так:
Python
1
sol = list((array[i][-1]/array[i][i]) for i in range(len(array)))
но интересно, почему тот вариант не срабатывает.
0
07.04.2012, 21:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.04.2012, 21:37
Помогаю со студенческими работами здесь

Ускорение вычислений на Python
Здравствуйте, подскажите, пожалуйста как можно ускорить этот кусок кода? from scipy import...

Ошибка приоритета вычислений
Известны координаты на плоскости двух точек. Составить программу вычисления расстояния между ними....

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

Реализация в среде вычислений прямого алгоритма вычислений
Индуктивность дросселя определяется формулой L=μ*μ0*S/l*W^2 Определить число слоев намотки...

Неточности в вычислениях
вот программа #include<stdio.h> #include<math.h> #include<time.h> #include<stdlib.h> float x1,...

Неточности с делением
Здравствуйте. Столкнулся с небольшой проблемой. Есть две такие простенькие функции (для...

Исправить неточности в методе
Смысл в том что метод частями работает, а если собрать все if то он начинает конфликтовать что ли....


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru