2014 dxdy logo

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

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




На страницу Пред.  1, 2, 3
 
 Re: Развиваю ли я навык программирования?
Сообщение29.12.2018, 17:23 
Аватара пользователя
sinx в сообщении #1364511 писал(а):
Программная функция это не просто "взял - отдал"?

Да.

Лучше думать про функции как про подпрограммы. "Зашёл - поблуждал - вышел" (или не вышел). С побочными эффектами, практически всегда.

 
 
 
 Re: Развиваю ли я навык программирования?
Сообщение29.12.2018, 19:06 

(Оффтоп)

worm2 в сообщении #1364559 писал(а):
У меня получился дискриминант $-9.44082049505282898612829111552\cdot10^{-30}$, так что, вроде бы, должен быть один корень.
А ведь да, с бесконечной арифметикой действительно получается так, тут я недоглядел. Фактически числа в условии - это округленные машинные представления, и тут это тоже влияет на результат.

Правда, задача от этого легче не стала. :-)

 
 
 
 Re: Развиваю ли я навык программирования?
Сообщение29.12.2018, 19:46 

(Оффтоп)

Munin в сообщении #1364500 писал(а):
Зверь! Альфа не берёт! Признавайтесь, какой правильный ответ :-)

Maple берет:

Maple 2016 писал(а):
eq := x^3-3.703703672022243*x^2+4.572473630050348*x-1.881676374871372;

solve(eq, x);

1.234576284, 1.234563694 + 0.000007268919916 I, 1.234563694 - 0.000007268919916 I

 
 
 
 Re: Развиваю ли я навык программирования?
Сообщение30.12.2018, 14:44 
Аватара пользователя
Обозначим:

$a = 3.703703672022243$

$b = 4.572473630050348$

$c = 1.881676374871372$

Можно заметить что $3b=a^2$ и $27c=a^3$ с относительной точностью $2^{-52}$. Таким образом можно считать, что с точностью до погрешностей округления чисел с плавающей запятой представленное на рассмотрение выражение является точным кубом. Стандартные процедуры поиска корней не рассчитаны на вылавливание последних значащих бит мантиссы числа с плавающей запятой, поэтому они частенько промахиваются. Например, предлагают пару комплексных корней там, где должна быть пара совпадающих действительных корней.

В качестве решения предлагаю считать число $a/3=1.234567890674081$. Видно, что автор нарочно взял числа "один", "два", "три" и так далее, остаётся вопрос, что означают числа "674081"?

Pphantom в сообщении #1364510 писал(а):
Там три вещественных корня, причем два из них отличаются в 14-м знаке.
Изображение

 
 
 
 Re: Развиваю ли я навык программирования?
Сообщение30.12.2018, 16:01 
Аватара пользователя
Я тут подумал и понял, о 14-ом знаке не может быть и речи. Ошибка на величину $2^{-52}$ в числе $b$ приведёт к ошибке на величину $\sqrt{{{2}^{-52}}}={{2}^{-26}}\approx 1.5\cdot {{10}^{-8}}$ в значении одно или нескольких корней, а ведь именно с такой точностью вычислялось число $b$. Поскольку тут целых три корня сгруппировались в кучку, то дела будут скорее всего ещё хуже. Наверняка утверждать не возьмусь, поскольку это требует дополнительного исследования.

 
 
 
 Re: Развиваю ли я навык программирования?
Сообщение30.12.2018, 16:27 
Аватара пользователя
B@R5uk в сообщении #1364772 писал(а):
Можно заметить что $3b=a^2$ и $27c=a^3$ с относительной точностью $2^{-52}$.

А если с неограниченной точностью? Как выглядит уравнение при замене $x'=x-a/3$?

 
 
 
 Re: Развиваю ли я навык программирования?
Сообщение30.12.2018, 18:25 
Аватара пользователя
Munin в сообщении #1364794 писал(а):
Как выглядит уравнение при замене $x'=x-a/3$?
Как-то так:
$$x'^3+b'x'+c'=0$$
с такими коэффициентами, если я с расчётами не накосячил:
$$b'=\frac{848'517'695'583'683}{1'000'000'000'000'000'000'000'000'000'000}\approx 8.48517695583683\cdot 10^{-16}$$
$$c'=\frac{295'660'285'773'761'832'165'204'873'441}{500'000'000'000'000'000'000'000'000'000'000'000'000'000'000}\approx 5.913205715475236\cdot 10^{-16}$$

Кстати, если считать "честно" в плавающей арифметике, то $b'$ оказывается равным $-8.8818\cdot 10^{-16}$, то есть не особо сильно промахивается относительно точного счёта, а $c'$ в точности равно нулю.

 
 
 
 Re: Развиваю ли я навык программирования?
Сообщение30.12.2018, 18:28 
B@R5uk в сообщении #1364784 писал(а):
Я тут подумал и понял, о 14-ом знаке не может быть и речи. Ошибка на величину $2^{-52}$ в числе $b$ приведёт к ошибке на величину $\sqrt{{{2}^{-52}}}={{2}^{-26}}\approx 1.5\cdot {{10}^{-8}}$ в значении одно или нескольких корней, а ведь именно с такой точностью вычислялось число $b$. Поскольку тут целых три корня сгруппировались в кучку, то дела будут скорее всего ещё хуже.
Да, по-видимому, Вы правы. Ну я уже писал, что перестарался с попыткой довести задачу до "предела", не проверив прямое решение.

 
 
 
 Re: Развиваю ли я навык программирования?
Сообщение30.12.2018, 18:42 
Аватара пользователя
Тут проблема даже не в том, что задача доведена до предела, а в том, что уравнение имеет повторяющиеся корни. Сам этот факт очень сильно портит ситуацию. Представьте себе, что у вас есть обычная кубическая парабола $y=x^3$. Вы сдвигаете её вверх или вниз на величину $10^{-15}$, на сколько изменится координата точки пересечения этой параболы с осью абсцисс? Очевидно, надо вычислить кубический корень из смещения. Получится $10^{-5}$. То есть ошибка на величину $10^{-15}$ у свободного члена кубического многочлена приводит при к ошибке на величину $10^{-5}$ у его корней, если эти корни совпадают. Вот к таким гадостям приводит зануление первых производных функции.

А на счёт плавающей арфиметики показателен график изучаемого многочлена в области его корня:

Изображение

Посчитан с несмещёнными коэффициентами.

 
 
 
 Re: Развиваю ли я навык программирования?
Сообщение30.12.2018, 20:54 
B@R5uk в сообщении #1364821 писал(а):
Тут проблема даже не в том, что задача доведена до предела, а в том, что уравнение имеет повторяющиеся корни. Сам этот факт очень сильно портит ситуацию.
Естественно, иначе все было бы неинтересно.

 
 
 
 Навык программирования
Сообщение31.12.2018, 09:22 
Аватара пользователя
Навык программирования вполне поможет развить RoboZZle.

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


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