2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу Пред.  1, 2
 
 Re: Как в С++ округить число до требуемого знака?
Сообщение04.08.2009, 20:48 
ewert в сообщении #232947 писал(а):
Только надо всё ж таки отдавать себе отчёт в том, что конкретныя языки тут не при чём. Если есть погрешность округления -- так она и есть. И никакое языкознание тут не спасёт. Увы.
Это точно. Языкознание в лучшем случае поможет написать более эффективную программу, хотя для этих целей наверное лучше подходят библиотеки, оптимизированные годами и профессионалами.

 
 
 
 Re: Как в С++ округить число до требуемого знака?
Сообщение04.08.2009, 23:52 
ewert в сообщении #232947 писал(а):
Только надо всё ж таки отдавать себе отчёт в том, что конкретныя языки тут не при чём. Если есть погрешность округления -- так она и есть. И никакое языкознание тут не спасёт. Увы.

По крайней мере в одном члене я от погрешности избавлюсь.
А это важно.Рассмотрим например уже приведённую систему.
$5x+3y+4z=1$
$0.000000000001x+y-2z=3$
Как найти её ФСР в этом случае? А если я грохну коэфициент во второй строчке при $x$ - то найти ФСР уже просто. Вот здесь мне уже и понадобится функция округления.

 
 
 
 Re: Как в С++ округить число до требуемого знака?
Сообщение05.08.2009, 11:08 
Dialectic в сообщении #232981 писал(а):
Как найти её ФСР в этом случае?

Подумаешь, бином Ньютона:
$$\begin{cases}
5.000000000000000\; x + 3.000000000000000\; y + 4.000000000000000\; z = 1.000000000000000 \\
0.000000000001000\; x + 1.000000000000000\; y - 2.000000000000000\; z = 3.000000000000000
\end{cases}$$
$$\begin{cases}
5.000000000000000\; x + 3.000000000000000\; y + 4.000000000000000\; z = 1.000000000000000 \\
0.999999999999400\; y - 2.000000000000800\; z = 2.999999999999800
\end{cases}$$
$$\begin{cases}
5.000000000000000\; x + 10.000000000006000\; z = -8.000000000004800 \\
0.999999999999400\; y - 2.000000000000800\; z = 2.999999999999800
\end{cases}$$
$$\begin{cases}
x + 2.000000000001200\; z = -1.600000000000960 \\
y - 2.000000000002000\; z = 3.000000000001600
\end{cases}$$
$$\begin{cases}
x = - 2.000000000001200\; z - 1.600000000000960 \\
y =  2.000000000002000\; z + 3.000000000001600
\end{cases}$$
(что, кстати, не называется ФСР)

 
 
 
 Re: Как в С++ округить число до требуемого знака?
Сообщение05.08.2009, 13:09 
То есть Вы предлагаете прогонять матрицу методом Гаусса в общем случае 2 раза. На первом шаге мы получаем некую "почти равносильную" матрицу, на втором - обнуляем коэфициенты окончательно. Я всё-таки пологаю, что округлить будет гораздо быстрее... А потом - лихо же Вы добавили разрядов в число, забыв, что у нас все типы имеют жестко фиксированные размеры.

Цитата:
(что, кстати, не называется ФСР)

То, что получилось в результате у Вас - действительно не является ФСР. А я реализую алгоритм, который
выдаёт на выходе ортонормированную систему векторов образующую собой базис пространства решений.

 
 
 
 Re: Как в С++ округить число до требуемого знака?
Сообщение05.08.2009, 13:47 
Dialectic в сообщении #233039 писал(а):
ортонормированную систему векторов образующую собой базис пространства решений.

Система неоднородна, поэтому у неё нет "базиса". Термин "фундаментальная система решений" принято использовать только для однородных задач.

Dialectic в сообщении #233039 писал(а):
лихо же Вы добавили разрядов в число, забыв, что у нас все типы имеют жестко фиксированные размеры.

А он и есть фиксированный: 15-16 значащих цифр -- это стандартный формат double. А добавил я их намеренно -- чтобы продемонстрировать Вам погрешность, вносимую Вами огруглением до 12-ти разрядов.

Dialectic в сообщении #233039 писал(а):
То есть Вы предлагаете прогонять матрицу методом Гаусса в общем случае 2 раза.

Какие ещё два? Это -- стандартный метод Гаусса (Вы ж его хотели), другого и не бывает. Разве что диагональные элементы нормируются в самом конце (по стандарту -- на каждом шаге). Но это сделано лишь для наглядности, и никакой роли не играет.

 
 
 
 Re: Как в С++ округить число до требуемого знака?
Сообщение05.08.2009, 14:59 
ewert в сообщении #233053 писал(а):
Dialectic в сообщении #233039 писал(а):
ортонормированную систему векторов образующую собой базис пространства решений.

Система неоднородна, поэтому у неё нет "базиса". Термин "фундаментальная система решений" принято использовать только для однородных задач.

Виноват. Подзабыл уже определения. Мы естественно ищем базис соответствующей однородной системы+ частное решение неоднородной.

ewert в сообщении #233053 писал(а):
Dialectic в сообщении #233039 писал(а):
То есть Вы предлагаете прогонять матрицу методом Гаусса в общем случае 2 раза.

Какие ещё два? Это -- стандартный метод Гаусса (Вы ж его хотели), другого и не бывает. Разве что диагональные элементы нормируются в самом конце (по стандарту -- на каждом шаге). Но это сделано лишь для наглядности, и никакой роли не играет.

Стандартный это когда используется метод прямой и обратной прогонки.Но насколько я понял - Вы предлагаете сделать два раза прямую и два раза обратную прогонку.
Вот Вам система:
$3x+2y-z=2$
$7x-2x+3z=3$
- продемонстрируйте пожалуйста, как Вы собираетесь обнулить коэфициент при x не прибегая к округлению и двойному проходу в "один конец"?

 
 
 
 Re: Как в С++ округить число до требуемого знака?
Сообщение05.08.2009, 15:18 
Надо полагать, имелось всё же в виду
$\begin{cases}3x+2y-z=2 \\ 7x-2y+3z=3\end{cases}$.
Пожалуйста, канонический алгоритм:
$\begin{cases}x+{2\over3}y-{1\over3}z={2\over3} \\ -{20\over3}y+{16\over3}z=-{5\over3}\end{cases}$
$\begin{cases}x+{1\over5}z={1\over2} \\ y-{4\over5}z={1\over4}\end{cases}$
Первая система -- это результат первого шага, вторая -- второго (если интерпретировать это как метод Гаусса без обратного хода). Или, если угодно: первая -- это первый (и последний) шаг прямого хода, вторая -- единственный шаг обратного.

Как-то я всё никак не пойму, чего Вы хотите.

 
 
 
 Re: Как в С++ округить число до требуемого знака?
Сообщение05.08.2009, 16:03 
ewert в сообщении #233098 писал(а):
Надо полагать, имелось всё же в виду
$\begin{cases}3x+2y-z=2 \\ 7x-2y+3z=3\end{cases}$.
Пожалуйста, канонический алгоритм:
$\begin{cases}x+{2\over3}y-{1\over3}z={2\over3} \\ -{20\over3}y+{16\over3}z=-{5\over3}\end{cases}$
$\begin{cases}x+{1\over5}z={1\over2} \\ y-{4\over5}z={1\over4}\end{cases}$
Первая система -- это результат первого шага, вторая -- второго (если интерпретировать это как метод Гаусса без обратного хода). Или, если угодно: первая -- это первый (и последний) шаг прямого хода, вторая -- единственный шаг обратного.


То что Вы тут продемонстрировали, разумеется правильно. Но только как указывалось
ещё EtCetera - для проведения таких вычислений -необходимо иметь специальный класс работающий с рациональными числами. А вообще, тема давно уже исчерпана. Всем спасибо за помощь и участие.

 
 
 
 Re: Как в С++ округить число до требуемого знака?
Сообщение05.08.2009, 17:12 
Аватара пользователя
Dialectic писал(а):
А вообще, тема давно уже исчерпана.

Только не для Вас. Чтобы рассеять сумбур, царящий в Вашей голове, советую почитать классику: например, Уилкинсона "Алгебраическая проблема собственных значений" - 4-ую главу.

 
 
 [ Сообщений: 24 ]  На страницу Пред.  1, 2


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group