Apakah ada algoritma numerik untuk menemukan kemiringan asimptotik?

23

Saya memiliki serangkaian titik data (xsaya,ysaya) yang saya harapkan (kira-kira) mengikuti fungsi y(x) yang asimtot ke garis pada besar x. Pada dasarnya, mendekati nol sebagai , dan hal yang sama mungkin dapat dikatakan untuk semua turunan , , dll. Tapi saya tidak tahu apa bentuk fungsional untuk , apakah ia memiliki bentuk yang dapat dideskripsikan berdasarkan fungsi-fungsi dasar.x f ( x ) f ( x ) f ( x )f(x)y(x)-(Sebuahx+b)xf(x)f(x)f(x)

Tujuan saya adalah untuk mendapatkan estimasi terbaik dari asimtotik lereng . Metode mentah yang jelas adalah untuk memilih beberapa titik data terakhir dan melakukan regresi linier, tetapi tentu saja ini tidak akurat jika tidak menjadi "cukup datar" dalam kisaran yang saya miliki datanya. Metode less-crude yang jelas adalah dengan menganggap bahwa (atau bentuk fungsional tertentu lainnya) dan cocok dengan yang menggunakan semua data, tetapi fungsi sederhana yang saya coba seperti atau \ dfrac1 {x} tidak cukup cocok dengan data di bawah x di mana f (x)f ( x ) x f ( x ) exp ( - x ) exp ( - x ) 1Sebuahf(x)xf(x)exp(-x)exp(-x) xf(x)1xxf(x)besar. Apakah ada algoritma yang diketahui untuk menentukan kemiringan asimptotik yang akan melakukan lebih baik, atau yang dapat memberikan nilai untuk kemiringan bersama dengan interval kepercayaan, mengingat kurangnya pengetahuan saya tentang bagaimana tepatnya data mendekati asymptote?


Tugas semacam ini cenderung sering muncul dalam pekerjaan saya dengan berbagai set data, jadi saya sebagian besar tertarik pada solusi umum, tetapi dengan permintaan saya menghubungkan ke set data tertentu yang mendorong pertanyaan ini. Seperti dijelaskan dalam komentar, algoritma Wynn ϵ memberikan nilai yang, sejauh yang saya tahu, agak tidak aktif. Berikut ini plotnya:

Data linear asimptotik

(Itu memang terlihat seperti ada sedikit kurva ke bawah pada nilai x tinggi, tetapi model teoritis untuk data ini memprediksi bahwa itu harus linier asimptotik.)

David Z
sumber
Ini mungkin terlalu mendasar - atau terlalu samar - untuk situs ini, tetapi saya pikir beta pribadi adalah waktu untuk mencoba hal-hal seperti itu.
David Z
Tidak, saya pikir ini pertanyaan yang bagus. Tidak semuanya harus canggih dan mewah. Solusi bagus untuk masalah sederhana adalah penting.
Colin K
@Dan: apakah penggantian benar-benar bisa diterima exp
JM
Memiliki exp cenderung membuat segalanya lebih sulit bagi saya untuk membaca, tetapi saya akui bahwa itu cukup kecil sehingga saya tidak seharusnya melakukannya.
Dan
Saya benar-benar tidak peduli dengan cara apa pun, saya pikir saya mungkin juga menyetujui suntingan karena, well, mengapa tidak. Anda mendapatkan reputasi pasangan dari itu, apa pun itu layak.
David Z

Jawaban:

13

Ini adalah algoritma yang agak kasar, tetapi saya akan menggunakan prosedur berikut untuk perkiraan kasar: jika, seperti yang Anda katakan, konon yang mewakili sudah hampir linier dengan meningkatnya , apa yang saya ' yang harus dilakukan adalah mengambil perbedaan , dan kemudian menggunakan algoritma ekstrapolasi seperti transformasi Shanks untuk memperkirakan batas perbedaan. Hasilnya mudah-mudahan merupakan estimasi yang baik untuk kemiringan asimptotik ini.f(x)(xsaya,ysaya)xysaya+1-ysayaxsaya+1-xsaya


Berikut ini adalah demonstrasi Mathematica . Algoritma Wynn adalah implementasi transformasi Shanks yang nyaman, dan dibangun sebagai fungsi (tersembunyi) . Kami mencoba prosedur pada fungsiϵSequenceLimit[]

4x2+3+2x+e-4x+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

Saya mungkin juga memamerkan betapa sederhananya algoritma ini:

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

Implementasi ini diadaptasi dari makalah Weniger .

JM
sumber
Hanya ingin tahu, tetapi mengapa Anda menggunakan fungsi aslinya, alih-alih menggabungkan semua persyaratan?
rcollyer
L.SEBUAHTEX
Seberapa dekat dengan rata apakah poin-poin tersebut agar algoritma menjadi efektif?
rcollyer
2
Oke, pertanyaan terakhir (saya bersumpah), dapatkah Anda menghasilkan kesalahan yang terikat pada perkiraan?
rcollyer
1
Itu agak rumit. Saya telah melihat beberapa metode yang disarankan dalam beberapa makalah, tetapi saya akui tidak melakukan eksperimen dengan mereka. (Mungkin saya harus, suatu hari nanti.) Buku karya Brezinski dan Redivo-Zaglia memiliki beberapa petunjuk yang mungkin ingin Anda lihat.
JM