Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2012.03.25;
Скачать: [xml.tar.bz2];

Вниз

Увеличение точности вычислений до 30-40 значащих цифр   Найти похожие ветки 

 
Roman-555   (2010-05-05 14:09) [0]

Собственно сам программистом не являюсь, но по ходу дела приходится иногда решать математические задачи, поэтому прошу помочь.

Есть система нелинейных уравнений с 9-ю переменными. При решении приходится находить обратную матрицу для матрицы Якоби. На "простых" матрицах (с небольшими числами вроде "1", "3", "-2" и малых размерностей) обратная матрица находится легко и правильно. Но в случае матрицы Якоби в моей задаче используются числа вроде "15067.908886...". Я нахожу обратную матрицу, но при перемножении ее и исходной получается не совсем единичная матрица. Некоторые строки вычисляются относительно точно (т. е., например, 9-я строка скопировання из watch: (-4,6642160968e-09, 1,5704483588e-08, 3,1408967176e-08, 1,4695463784e-08, -3,6544084438e-09, 3,2663929683e-10, 4,0296994433e-08, -7,4864776945e-09, 0,99999977354)), а другие выглядят подобным образом (1-я строка): (-1,0618292545, 63,621947092, 127,24389418, 63,619455455, -1,0563410126, 35,543700645, 125,74593629, -80,130245746, -945,80434479).

Все данные хранятся в статических массивах 9*9, элементы которых имеют тип данных extended.

Предполагаю, что причина тут в точности вычислений (extended содержит 18-20 значащих цифр), тем более, что Excel считает примерно так же криво (точность расчетов в Excel 15-16 значащих цифр).

Кстати, интересный факт, при перемножении обратной матрицы и исходной "правильно"(т. е. в виде (1 0 0 0..)) выглядят 3,6,7,8 и 9 строки, а "неправильно" 1, 2, 4, 5.

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

В итоге вопросы:

1.Возможно существуют какие-либо библиотеки или что-то в этом роде, для более точных расчетов. Нужны ссылки, названия, возможно какие-то основы.

2.Если нет, то какой-нибудь совет как это можно реализовать. Конечно у меня мысли есть, но боюсь, что они слишком дилетантские и нерациональные.


 
Игорь Шевченко ©   (2010-05-05 14:32) [1]

http://delphimaster.net/view/2-1273042460/


 
MBo ©   (2010-05-05 14:35) [2]

Какой метод обращения матрицы используется - прямой (Гаусса, LU) или итерационный (Шульца, Фаддеева)?


 
Dimka Maslov ©   (2010-05-05 14:48) [3]

Точность можно потерять и при простом повороте координатной системы, если система уравнений плохо обусловлена, когда мы имеем дело с малыми разностями двух больших чисел.
В моей практике инженерных расчётов для матрицы порядка 200х200 обращение даёт приемлемый по точности результат (ошибка не более 0.5%) даже при использовании типа double.
Поэтому если даже при 9х9 точность неприемлема, увеличение количества значащих цифр вряд-ли поможет, надо просто искать другой метод решения.


 
Leonid Troyanovsky ©   (2010-05-05 18:34) [4]


> Roman-555   (05.05.10 14:09)  

> Есть система нелинейных уравнений с 9-ю переменными. При
> решении приходится находить обратную матрицу для матрицы
> Якоби.

Надо посчитать или оценить макс и мин собственные значения
матрицы. Если они отличаются в 1000 и более - это проблема.
Но, и решений было выработано немало, IMHO, еще в 70-80 годах
прошлого века.

Кста, были и методы, не требующие обращения матрицы, а токмо
решения системы ЛУ (в т.ч. итерационные), что, ЕМНИП, проще.

--
Regards, LVT.


 
Юлай   (2010-11-16 12:10) [5]

В Delphi 7 у меня была похожая проблема. Выглядела она так. Запускаем прогу, точность - достаточная. После вызова функции

function SelectDirectory(const Caption: string; const Root: WideString;
 var Directory: string): Boolean;

точность неожиданно падала. Расследование показало, что точность падает после вызова ShBrowseForFolder, которая вызывается в SelectDirectory.  Сама по себе ShBrowseForFolder - это внешняя функция библиотеки shell32.dll.
Как решение наше статью про Set8087CW и про Get8087CW. Эксперимент показал, что до вызова SelectDirectory 9-й бит переменной полученной через Get8087CW был равен единице и точность была высокой. После вызова функции SelectDirectory 9-й бит переменной полученной через Get8087CW становился равным нулю и точность резко падала. Для меня резко, означает ошибки при работе с матрицами для полинома 10-го и более высокого порядка. Чтобы не париться перед работой с полиномами сделал дополнительный блок:

if (Get8087CW and 256) = 0 then Set8087CW(Get8087CW or 256);

Сейчас все работает. Хотя иногда переключаюсь насильно на менее точные расчеты, но более быстрые через:

if (Get8087CW and 256) <> 0 then Set8087CW(Get8087CW xor 256);


 
Юлай   (2010-11-16 12:11) [6]

В Delphi 7 у меня была похожая проблема. Выглядела она так. Запускаем прогу, точность - достаточная. После вызова функции

function SelectDirectory(const Caption: string; const Root: WideString;
 var Directory: string): Boolean;

точность неожиданно падала. Расследование показало, что точность падает после вызова ShBrowseForFolder, которая вызывается в SelectDirectory.  Сама по себе ShBrowseForFolder - это внешняя функция библиотеки shell32.dll.
Как решение наше статью про Set8087CW и про Get8087CW. Эксперимент показал, что до вызова SelectDirectory 9-й бит переменной полученной через Get8087CW был равен единице и точность была высокой. После вызова функции SelectDirectory 9-й бит переменной полученной через Get8087CW становился равным нулю и точность резко падала. Для меня резко, означает ошибки при работе с матрицами для полинома 10-го и более высокого порядка. Чтобы не париться перед работой с полиномами сделал дополнительный блок:

if (Get8087CW and 256) = 0 then Set8087CW(Get8087CW or 256);

Сейчас все работает. Хотя иногда переключаюсь насильно на менее точные расчеты, но более быстрые через:

if (Get8087CW and 256) <> 0 then Set8087CW(Get8087CW xor 256);


 
Anatoly Podgoretsky ©   (2010-11-16 16:57) [7]

> Юлай  (16.11.2010 12:10:05)  [5]

if (Get8087CW and 256) = 0 then Set8087CW(Get8087CW or 256);

Set8087CW(Get8087CW or 256);



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2012.03.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.003 c
2-1323679506
Handle
2011-12-12 12:45
2012.03.25
множества


1-1289813557
cr@nk
2010-11-15 12:32
2012.03.25
Delphi и RDP


15-1307176521
Inovet
2011-06-04 12:35
2012.03.25
Некоммерческое кино


15-1322648968
Мушрумхэдовец
2011-11-30 14:29
2012.03.25
Как обновить программно страницу браузера?


15-1322680807
upc
2011-11-30 23:20
2012.03.25
Встроенные классы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский