2014 dxdy logo

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

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




На страницу Пред.  1, 2, 3  След.
 
 Re: Помогите придумать апроксимацию
Сообщение05.06.2014, 22:13 
А зачем рождать различные арксинусы/экспоненты, работающие на всем интервале и все равно считающиеся через ряды? Массив точек потребует немножко памяти, его размер (шаг) зависит от выбранного способа интерполяции и может быть всего несколько десятков точек - функция достаточно гладкая, зато считаться будет гораздо быстрее одной громоздкой формулы.

ЗЫ вдобавок, этот метод и производные нужных порядков с заданной точностью легко аппроксимирует, а одна красивая формула - очень вряд ли! Ради интереса можете проверить точность аппроксимации производной вашим "шедевром математического искусства".

 
 
 
 Re: Помогите придумать апроксимацию
Сообщение05.06.2014, 22:49 
Аватара пользователя
_Ivana в сообщении #872204 писал(а):
проверить точность аппроксимации
В книге сказано, что она не превышает $1.5\cdot10^{-7}$. Не думаю, что там соврали.

_Ivana в сообщении #872204 писал(а):
всего несколько десятков точек - функция достаточно гладкая
Это через чур оптимистичное утверждение ещё надо проверить на практике. Часто бывает так, что функция в плане гладкости на пределе совершенства, а аппроксимировать её как следует весьма сложно.

В общем, буду пробовать, а там видно будет, какие проблемы возникнут.

 
 
 
 Re: Помогите придумать апроксимацию
Сообщение05.06.2014, 22:59 
_Ivana в сообщении #872204 писал(а):
точность аппроксимации производной

B@R5uk в сообщении #872221 писал(а):
Не думаю
Правильно, думать не надо - надо просто проверить.
B@R5uk в сообщении #872221 писал(а):
Часто бывает так, что функция в плане гладкости на пределе совершенства, а аппроксимировать её как следует весьма сложно.
Если пытаться во что бы то ни стало найти одну формулу для всего интервала, то возможно. А если сделать по-нормальному, как уже было не раз предложено - то нет никаких сложностей.

 
 
 
 Re: Помогите придумать апроксимацию
Сообщение05.06.2014, 23:04 
Аватара пользователя
Пока мне видятся следующая проблема. Разбивая область определения функции на отрезки и аппроксимируя функцию на каждом участке своим полиномом мне необходимо подбирать их коэффициенты так, чтобы 1) функция приближалась наилучшим образом при наименьшем числе коэффициентов (наименьшей степени полинома), 2) на границах полиномы должны гладко стыковаться. Сплайны в этом плане не подходят, так как они удобны для интерполяции (когда набор точек, в которых функция известна существенно ограничен), о их применимости для аппроксимации я никаких теорем не знаю, а практика показала, что они не удобны.

Тут мне видится один путь: требовать, чтобы на концах отрезка не только значения аппроксимирующих полиномов равнялись значениям функции, но их их (полиномов и функции) производные совпадали. Это приведёт к небольшой избыточности в суммарном количестве коэффициентов полиномов, за то будет легче искать аппроксимацию. Если есть какие-нибудь идеи по этому поводу, буду рад услышать.

-- 06.06.2014, 00:05 --

_Ivana в сообщении #872227 писал(а):
надо просто проверить.
Прошу прощения, проглядел. Мне даже стало интересно, как там обстоят дела.

 
 
 
 Re: Помогите придумать апроксимацию
Сообщение06.06.2014, 02:46 
Попробовал немножко поинтерполировать вашу функцию. При равномерном шаге $0.01$ и интерполяции локальным кубическим сплайном Эрмита с оценкой производных в краях интервала по 7 точкам (по-русски говоря, на каждом интервале полином третьей степени, коэффициенты рассчитываются за несколько сложений/умножений, итоговый сплайн непрерывен и имеет непрерывную первую производную) ошибка интерполяции на интервале $[0, 0.5]$ не превышает $6\cdot 10^{-8}$ - при заданном шаге для этого интервала потребуется хранить массив всего 50 значений функции. При аргументе больше $0.6$ при таком шаге ошибка резко уменьшается, при аргументе большем $1$ - до $1\cdot 10^{-11}$ и менее - можно выбрать более редкий шаг - существенно уменьшить массив хранимых значений.
При том же шаге и локальном сплайне Эрмита пятой степени (непрерывен сам сплайн и его первая и вторая производные, производные рассчитываются также по 7 точкам), ошибка на интервале $[0, 0.1]$ не превышает $3.5\cdot 10^{-8}$ (нужны всего 10 значений функции), на $[0.1, 0.15]$ не превышает $1\cdot 10^{-9}$ и далее порядок ошибки падает аналогично первому сплайну.
Изображение
Если непонятно, могу написать формулы интерполяции данных сплайнов. Также можно легко скомбинировать эти сплайны с вашей найденной аппроксимацией в начальном интервале и вашим алгоритмом расчета хвоста.

 
 
 
 Re: Помогите придумать апроксимацию
Сообщение06.06.2014, 07:34 
B@R5uk в сообщении #872095 писал(а):
Sender, не совсем понял, что вы предлагаете.

Ну вот есть у вас 2 функции $f_1(x)$ и $f_2(x)$, заданные на $\mathbb{R}$. Вы хотите получить функцию $$f(x)=\left\{\begin{matrix}
f_1(x),\;x<0
\\ 
f_2(x),\;x\geqslant 0.
\end{matrix}\right.$$

В вашем распоряжении имеется функция
$$\theta(x)=\left\{\begin{matrix}
0,\;x<0
\\ 
1,\;x\geqslant 0.
\end{matrix}\right.$$
Тогда искомую функцию можно задать в виде $f(x)=f_1(x)\theta(-x)+f_2(x)\theta(x).$
P.S. Не путать с тета-функциями, упомянутыми ИСН. :-)

 
 
 
 Re: Помогите придумать апроксимацию
Сообщение06.06.2014, 11:24 
Аватара пользователя
_Ivana в сообщении #872284 писал(а):
...и интерполяции локальным кубическим сплайном Эрмита...

Я так понял, вы предлагаете затабуировать именно значения функции с каким-то шагом. А в промежутках считать по соседним точкам. Это самый простой подход, и функция всегда будет совпадать со своей аппроксимацией в точках табуирования. Но не смотря на это, мне он кажется не совсем рациональным. В промежуточных точках функция может отличаться от аппроксимации при таком подходе сильнее, чем если использовать "мягкую" аппроксимацию, которая не заставляет совпадать функцию и аппроксимацию в каждой точке таблицы.
_Ivana в сообщении #872284 писал(а):
При аргументе больше $0.6$ при таком шаге ошибка резко уменьшается
Это весьма закономерно. Во-первых, чем больше аргумент, тем меньше членов ряда играют роль. Для аргументов больших $2.0$ можно считать, остаётся всего одна экспонента. А во-вторых, функция вблизи нуля ведёт себя очень плохо: есть подозрение, что все производные в нуле раны нулю, а чем старше производная, тем сильнее и чаще она осциллирует:

Изображение

_Ivana в сообщении #872284 писал(а):
Попробовал немножко поинтерполировать вашу функцию.
Раз уж на то пошло, может сверим таблицы значений функции? Вдруг я не правильно что-то посчитал? Вот моя таблица.

 
 
 
 Re: Помогите придумать апроксимацию
Сообщение06.06.2014, 15:17 
Продолжая про сплайны. Если хранить заранее рассчитанные значения первой и второй производной, то объем таблицы увеличится втрое, но и точность возрастет. На графиках показаны ошибки интерполяции самой функции и ее первой производной - можете посмотреть порядок точности. Шаг тот же, $0.01$, сплайн 5 порядка, коэффициенты считаются еще быстрее в отличие от предыдущего случая - нам не надо оценивать производные, они уже есть. На данном интервале потребуется всего 3 таблицы по 20 точек.
Изображение Изображение

ЗЫ не вижу смысла придумывать что-то еще, когда представленный сплайн дает такой результат при минимуме затрат. Хотя, можно сделать неравномерный шаг (например, экспоненциальный), при этом сложность расчета коэффициентов почти не изменится.

ЗЗЫ моя таблица значений функции на вашем шаге разумеется не совпадает с вашей, мне моя кажется симпатичнее, но в пост на форуме она не влезла, а своего сайта на народе у меня нет - могу отправить ее в текстовом виде вам на почту, например.

 
 
 
 Re: Помогите придумать апроксимацию
Сообщение06.06.2014, 16:24 
Аватара пользователя
_Ivana в сообщении #872469 писал(а):
таблица значений функции разумеется не совпадает с вашей
В каком знаке различие? Как это различие плавает в начале, в середине и в конце таблицы?

 
 
 
 Re: Помогите придумать апроксимацию
Сообщение06.06.2014, 16:26 
Детально не анализировал, могу скинуть таблицу. Могу еще попробовать дошлифовать функцию для большей точности.

UPD посмотрел, у вас 16 знаков выведено, а у меня только 15 в длинном формате вывода Матлаба, поэтому где у вас последний знак пляшет, у меня все визуально красиво, а точность похоже одинакова. Но в любом случае ее более чем достаточно, чтобы ловить ошибки в 15 знаке после запятой.

 
 
 
 Re: Помогите придумать апроксимацию
Сообщение06.06.2014, 20:04 
Аватара пользователя
Функция$$g\left(x\right)=1-\exp\left(-\frac{1}{a_0+a_1 x+a_2 x^2+a_3 x^3+a_4 x^4+a_5 x^5+a_6 x^6} \right)$$где$$\begin{align}
  & a_0=0.00064291 \\ 
 & a_1=1.55906286 \\ 
 & a_2=-2.4098668 \\ 
 & a_3=14.494017 \\ 
 & a_4=-59.45774 \\ 
 & a_5=148.0868 \\ 
 & a_6=-160.06805 
\end{align}$$приближает мой ряд на отрезке $[0,0.2]$ с точностью не хуже $10^{-7}$:

Изображение

_Ivana, можете попробовать проверить по вашим данным, ни где я не напортачил?

(Константы)

Код:
a=[
   160.06805
  -148.08680
   059.45774
  -014.494017
   002.4098668
  -001.55906286
  -000.00064291
    ];

 
 
 
 Re: Помогите придумать апроксимацию
Сообщение06.06.2014, 20:10 
Проверю, когда до Матлаба доберусь. Константы бы дублировали в теге кода, чтобы напрямую копипастить... Пора бы уже точность аппроксимации производных проверить, что у "шедевра математического искусства", что у этого приближения. За сплайны то я в этом смысле не переживаю, по понятным причинам.

 
 
 
 Re: Помогите придумать апроксимацию
Сообщение06.06.2014, 20:19 
Аватара пользователя
_Ivana в сообщении #872584 писал(а):
Константы бы дублировали в теге кода
Сделано!

_Ivana в сообщении #872584 писал(а):
Пора бы уже точность аппроксимации производных проверить, что у "шедевра математического искусства"
У шедевра проверял (правда, производную численно считал). В нуле какая-то острая неприятность, а так очень даже не плохо: не хуже $3\cdot 10^{-6}$

 
 
 
 Re: Помогите придумать апроксимацию
Сообщение06.06.2014, 21:06 
Проверил, все так. Только на будущее, константы в коде это хорошо, но не заставляйте людей додумываться, что вы им поменяли знаки, убрав минус из показателя экспоненты.
Также проверил точность аппроксимации производной - на заданном интервале ошибка вплоть до $1\cdot 10^{-5}$ - если я не ошибся, считал численно при разных шагах, что неплохо, но далеко от желаемой вами же точности. А теперь вопрос - и сдалась вам экспонента, считающаяся через ряд, да еще с такой производной? Вы принципиально не любите предложенные мною сплайны или это спортивный интерес поиска философского камня?

 
 
 
 Re: Помогите придумать апроксимацию
Сообщение06.06.2014, 21:22 
Аватара пользователя
_Ivana в сообщении #872602 писал(а):
что вы им поменяли знаки
Упс! Это следствие бездумного копипаста из текста скрипта. Прошу прощения.
_Ivana в сообщении #872602 писал(а):
и сдалась вам экспонента
Ну, она очень хорошо отражает тот факт, что у функции в нуле особенность. И опять же, я получил желаемую точность с помощью всего семи (!!!) вспомогательных цифр.
_Ivana в сообщении #872602 писал(а):
не любите предложенные мною сплайны
Если честно, я не понял, как они работают. Сплайн проводится через две табличных точки, между которыми ищется значение, при этом первая и вторая производная сплайна на концах так же задана таблицей. Правильно? Получается 6 параметров и 5-я степень полинома?

-- 06.06.2014, 22:35 --

Посчитал производную математического шедевра по-чесному аналитически. Сравнил с оригинальной производной функции ошибок. Максимальная ошибка вблизи нуля и не превышает $8\cdot 10^{-6}$. На мой взгляд, это очень хорошая аппроксимация. Хотя, конечно, всё зависит от приложений.

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


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