Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Сравнения элемента матрицы с 0

18K
14 октября 2006 года
anxieux
12 / / 14.10.2006
Чтобы сравнить действительное число с 0 используют стандартную конструкцию типа
 
Код:
const double eps = 0.00000001; // или #define в С
...
double x;
...
if(fabs(x) < eps) {
  ... //можно считать x нулем
}


Если же x - элемент матрицы A, то, вообще говоря, eps зависит от нормы A, сравните:
a[1][1] = 0.1, a[j] = 1000000000000 forall i,j (i!=1 || j!=1)
и
a[1][1] = 0.1, a[j] = 0.000000000001 forall i,j (i!=1 || j!=1)

В первом случае a[1][1] можно считать 0. А во втором вряд ли.

Я ищу обратную матрицу методом Холецкого, хотя это не принципиально. На определенном этапе, мне надо узнать: является ли число x нулем или нет. (если да, то матрица вырождена и все пропало) Если выбрать eps произвольной константой, то это, очевидно, неправильно.

вопрос: какая может быть выбрана зависимость eps от ||A||?
5.4K
14 октября 2006 года
Svyatozar
221 / / 11.09.2006
не понял вопроса
18K
14 октября 2006 года
anxieux
12 / / 14.10.2006
Может быть что-нибудь в духе:
eps = ||A||*exp(-|ln max(|Aij|)|)
????
2.9K
14 октября 2006 года
Ation
96 / / 27.07.2004
if(x != 0) {
... //можно считать x нулем
}

а в чем заковыка?7 :/
18K
14 октября 2006 года
anxieux
12 / / 14.10.2006
[QUOTE=Ation]if(x != 0) {
... //можно считать x нулем
}

а в чем заковыка?7 :/[/QUOTE]

Попробуй откомпилировать (желательно в gcc выставив warning-и на полную), и увидишь.:)
На самом деле С не умеет сравнивать не int (т.е. действительные числа) с 0. Вообще он не умеет сравнивать два действительных числа. (сравнивать - т.е. узнавать равны они или нет)
Применительно к выше обозначеной задаче:
если минимальный по модулю элемент матрицы >10000000, а определитель <0.00001 то матрицу, видимо, можно считать вырожденной.
5.4K
15 октября 2006 года
Svyatozar
221 / / 11.09.2006
попробуй перегрузить функцию сравнения используя двоичную арифметику?
Вообще на С++ можно реализовать свой тип данных нужной точности. Лично я делал матричный класс используя свой тип fraction, состоящий из целочисленных long числителя и знаменателя
18K
15 октября 2006 года
anxieux
12 / / 14.10.2006
ты действительно не понял вопрос:
он скорее математический, чем программистский, и он не требует никаких технических ухищрений. Я понимаю, как сделать класс с перегруженным оператором сравнения, мне просто это не нужно. Мне надо узнать равно число 0 или нет. При этом число может на самом деле не равняться 0, а я буду его считать 0, если оно значительно меньше нормы матрицы. Вопрос в том, что значит "значительно меньше".
5.4K
16 октября 2006 года
Svyatozar
221 / / 11.09.2006
жениться тебе надо :-)
12K
16 октября 2006 года
rjx
55 / / 11.03.2006
[QUOTE=anxieux]ты действительно не понял вопрос:
он скорее математический, чем программистский, и он не требует никаких технических ухищрений. Я понимаю, как сделать класс с перегруженным оператором сравнения, мне просто это не нужно. Мне надо узнать равно число 0 или нет. При этом число может на самом деле не равняться 0, а я буду его считать 0, если оно значительно меньше нормы матрицы. Вопрос в том, что значит "значительно меньше".[/QUOTE]

Вопрос стоит только в необходимой точности вычислений; как пример, бери наименьший эл-т матрицы, и присваивай eps:=min(M)*eps2, где eps2=10e-9, скажем. Или усреднённое значение элементов. В общем, всё зависит от почтановки задачи. В задачах, основанных на итерационных методах, всегда указывается максимальныя погрешность, поэтому выбирать только тебе.

Короче не заморачивайся, а исходи из конкретно поставленных задач. Если нужно отобразить точку на мониторе, то хватит и eps2=10e-2, а если считаешь траекторию полёта ИСЗ, то не меньше 10е-20 :)
18K
16 октября 2006 года
anxieux
12 / / 14.10.2006
[QUOTE=rjx]
Короче не заморачивайся, а исходи из конкретно поставленных задач. [/QUOTE]
К сожалению, задача поставлена абстрактно, и мне надо ее решить. Но скорее всего я так и сделаю (возьму eps = ||A||*smth, где smth взято от балды).

Насчет женитьбы юмора я не понял. :(
16K
17 октября 2006 года
PeaK
49 / / 02.10.2006
[QUOTE=anxieux]Насчет женитьбы юмора я не понял. :([/QUOTE]
Это не юмор, это суровая правда - пропадешь в коде иначе.
Вспомнив, что не целые числа, хранятся в виде x,xxxx *Eyyy. Т.е. даже нуль это какая-то бесконечно малая, то для каждого набора входных данных, нужно адаптировать алгоритм. В некоторых случаях, нужно вводить свой "Ноль", все что меньше которого, тому присваивается этот ноль, а все что умножается на ноль, отслеживать, что бы в итоге был все-равно "ноль". А не число в десять-миллион раз большее...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог