Есть ли числовой алгоритм для нахождения асимптотического наклона?

23

У меня есть ряд точек данных которые, как я ожидаю, (приблизительно) будут следовать функции которая асимптотически пересекается с линией при большом . По существу, приближается к нулю при , и то же самое, вероятно, можно сказать обо всех производных , и т. д. Но я не знаю, что такое функциональная форма для f (x) , если она даже имеет форму, которую можно описать в терминах элементарных функций.(xi,yi)y(x)xf(x)y(x)(ax+b)xf(x)f ( x )f(x)f(x)

Моя цель - получить максимально возможную оценку асимптотического наклона a . Очевидный грубый метод состоит в том, чтобы выбрать последние несколько точек данных и выполнить линейную регрессию, но, конечно, это будет неточным, если f(x) не станет «достаточно плоским» в диапазоне x для которого у меня есть данные. Очевидный менее грубый метод состоит в том, чтобы предположить, что f(x)exp(x) (или некоторая другая конкретная функциональная форма) и подходит для этого, используя все данные, но простые функции, которые я пробовал как exp(x) или 1x не совсем совпадают с данными в нижнем x где f(x)большой. Существует ли известный алгоритм определения асимптотического наклона, который мог бы работать лучше или который мог бы обеспечить значение для наклона вместе с доверительным интервалом, учитывая мое отсутствие знаний о том, как данные приближаются к асимптоте?


Подобные задачи часто возникают в моей работе с различными наборами данных, поэтому я в основном заинтересован в общих решениях, но по запросу я связываюсь с конкретным набором данных, который вызвал этот вопрос. Как описано в комментариях, алгоритм Wynn ϵ дает значение, которое, насколько я могу судить, несколько не соответствует. Вот сюжет:

Асимптотически линейные данные

(Похоже, что при высоких значениях x наблюдается небольшая нисходящая кривая, но теоретическая модель для этих данных предсказывает, что она должна быть асимптотически линейной.)

Дэвид З
источник
Это может быть слишком элементарно - или слишком расплывчато - для этого сайта, но я подумал, что частная бета-версия - время попробовать такие вещи.
Дэвид З
Нет, я думаю, что это отличный вопрос. Не все должно быть продвинутым и модным. Хорошие решения простых проблем важны.
Колин К
@Dan: замена действительно оправдана? exp
JM
Наличие exps обычно усложняет мне чтение, но я признаю, что оно было достаточно маленьким, и мне не следовало этого делать.
Дан
В любом случае, мне все равно, я просто решил, что могу одобрить изменения, потому что, ну почему бы и нет. Вы получаете репутацию пары от этого, чего бы это ни стоило.
Дэвид З

Ответы:

13

Это довольно грубый алгоритм, но я бы использовал следующую процедуру для грубой оценки: если, как вы говорите, предполагаемое которое представляет ваш , уже почти линейно при увеличении , то я Для этого нужно взять различия , а затем использовать алгоритм экстраполяции, такой как преобразование Шенкса, для оценки предела различий. Мы надеемся, что результатом будет хорошая оценка этого асимптотического наклона.( x i , y i ) x y i + 1 - y if(x)(xi,yi)xyi+1yixi+1xi


Далее следует демонстрация Mathematica . Алгоритм Wynn - это удобная реализация преобразования Шенкса, и он встроен как (скрытая) функция . Опробуем процедуру на функцииϵSequenceLimit[]

4x2+3+2x+e4x+3
xdata = RandomReal[{20, 40}, 25];
ydata = Table[(3 + 13*E^(4*x) + 6*E^(4*x)*x + x^2 + 3*E^(4*x)*x^2 + 
      2*E^(4*x)*x^3)/(E^(4*x)*(3 + x^2)), {x, xdata}];

SequenceLimit[Differences[ydata]/Differences[xdata],
              Method -> {"WynnEpsilon", Degree -> 2}]
1.999998

Я мог бы также показать, насколько простой алгоритм:

wynnEpsilon[seq_?VectorQ] := 
 Module[{n = Length[seq], ep, res, v, w}, res = {};
  Do[ep[k] = seq[[k]];
   w = 0;
   Do[v = w; w = ep[j];
    ep[j] = 
     v + (If[Abs[ep[j + 1] - w] > 10^-(Precision[w]), ep[j + 1] - w, 
         10^-(Precision[w])])^-1;, {j, k - 1, 1, -1}];
   res = {res, ep[If[OddQ[k], 1, 2]]};, {k, n}];
  Flatten[res]]

Last[wynnEpsilon[Differences[ydata]/Differences[xdata]]]
1.99966

Эта реализация адаптирована из статьи Венигера .

JM
источник
Просто любопытно, но почему вы использовали первоначальную форму функции, вместо того, чтобы объединить все термины?
rcollyer
Это было только для демонстрационных целей. :) Я включил выражение -ed, чтобы вы, ребята, знали, каким должен быть ожидаемый ответ. Я хотел продемонстрировать, что вы можете проводить такой анализ сложной функции ...LATEX
JM
Насколько близко к плоскости должны быть точки, чтобы алгоритм был эффективным?
rcollyer
2
Хорошо, последний вопрос (клянусь), вы можете сгенерировать ошибку, связанную с оценкой?
rcollyer
1
Это немного сложнее. Я видел некоторые предложенные методы в нескольких статьях, но признаюсь, что не проводил с ними экспериментов. (Может быть, я должен был, на днях.) В книге Брезинского и Редиво-Заглии есть несколько указателей, которые вы, возможно, захотите изучить.
JM