2011-05-25 17 views
5

Ben Mathematica liste interpolasyon nasıl yaptığını ters-mühendislik ediyorum:(değil Hermite) grafiklerden Mathematica interpolasyon fonksiyonları tanımlamak

(* Fortunately, Mathematica WILL interpolate an arbitrary list *) 

tab = Table[a[i], {i,1,100}] 

f = Interpolation[tab] 

(* get the coefficient of each term by setting others to zero *) 

Plot[{f[42+x] /. {a[42] -> 0, a[43] ->0, a[44] -> 0, a[41] -> 1}}, 
{x,0,1}] 

Plot[{f[42+x] /. {a[41] -> 0, a[43] ->0, a[44] -> 0, a[42] -> 1}}, 
{x,0,1}] 

Plot[{f[42+x] /. {a[42] -> 0, a[41] ->0, a[44] -> 0, a[43] -> 1}}, 
{x,0,1}] 

Plot[{f[42+x] /. {a[42] -> 0, a[43] ->0, a[41] -> 0, a[44] -> 1}}, 
{x,0,1}] 

(* above is neither Hermite, nor linear, though some look close *) 

(* these are available at oneoff.barrycarter.info/STACK/ *) 

Table[f[42+x] /. {a[42] -> 0, a[43] ->0, a[44] -> 0, a[41] -> 1}, 
{x,0,1, 1/100}] >> /home/barrycarter/BCINFO/ONEOFF/STACK/coeff41.txt 

Table[f[42+x] /. {a[41] -> 0, a[43] ->0, a[44] -> 0, a[42] -> 1}, 
{x,0,1, 1/100}] >> /home/barrycarter/BCINFO/ONEOFF/STACK/coeff42.txt 

Table[f[42+x] /. {a[41] -> 0, a[42] ->0, a[44] -> 0, a[43] -> 1}, 
{x,0,1, 1/100}] >> /home/barrycarter/BCINFO/ONEOFF/STACK/coeff43.txt 

Table[f[42+x] /. {a[41] -> 0, a[42] ->0, a[43] -> 0, a[44] -> 1}, 
{x,0,1, 1/100}] >> /home/barrycarter/BCINFO/ONEOFF/STACK/coeff44.txt 

DÜZENLEME: Teşekkürler whuber! Tam olarak istediğimi yaptı. Referans için, katsayılar (sırayla):

(x-2)*(x-1)*x/-6 
(x-2)*(x-1)*(x+1)/2 
x*(x+1)*(x-2)/-2 
(x-1)*x*(x+1)/6 
+0

Okunabilirlik için, sadece bir arsa kaldırmak ya da daha küçük yapmak için yardımcı olacaktır. –

cevap

7

interpolatör parçalı polinom belgelerine göre. Bu biraz belirsiz, bu yüzden burada araştırılacak bir şey var.

Ara değerleyicinin verilerin doğrusal bir işlevi olduğunu deneysel olarak oluşturabilirsiniz. Tüm olası veriler için güzel bir temel, {1,0, ..., 0}, {0,1,0, ..., 0}, ..., {0, ..., formundaki vektörlerden oluşur. 0,1}. katsayılı bir $, $ ve $ b $ hareket eden, bu gibi bazı örnekler deneyerek doğrusallık teyit edebilir

test[n_, i_] := Module[{x = ConstantArray[0,n]},x[[i]] = 1; x] 

: Bu amaçla, en boy $ n $ bu vektörler üretmek için küçük bir işlevi oluşturmalarına izin

With[{a=1, b=2.5, n=5, i=2, j=3}, 
    Plot[{Interpolation[a test[n,i] + b test[n,j]][x], 
     a Interpolation[test[n,i]][x] + b Interpolation[test[n,j]][x]}, {x, 1, n}] 
] 

olacak ancak iki işlev üst üste için tek bir eğri: $ i^\ metni {inci} $ ve $ j^\ metni {inci} $ Ağırlık esasına göre uzunluk $ n $ vektörleri. Lineerliği oluşturduktan sonra, interpolator değerlerini $ n $ temeli vektörler üzerinde analiz etmek yeterli olacaktır. Polinomların derecelerini farklılaşma ile belirleyebilirsiniz. Varsayılan olarak derece 3'tür, ancak bunu "InterpolatingOrder" parametresiyle değiştirebilirsiniz. Aşağıdaki kod uzunluğu $ n $ verileri için bütün temel vektörleri, ioMax üzerinden sipariş 1 interpolasyon kullanarak interpolatör türevlerinden elde edilen belli parçalı sabit eğrilerinin bir tablo grafik halinde:

With[{n=7, ioMax = 5}, 
    Table[ 
     Module[{fns}, 
      fns = Table[Interpolation[test[n,i], InterpolationOrder->io], {i,1,n}]; 
      Table[Plot[[email protected][f[#], {#,io}]&[x], {x,1,n}, 
       PlotRange->Full, PlotStyle->Thick, ImageSize->150], {f, fns}] 
     ], {io, 1, ioMax} 
    ] 
] // TableForm 

çıkış gösteren aralar argümanın tamsayı değerlerinde meydana gelir ve uzunluk $ n $ ve $ d $ derecesi bir interpolator verisi için en fazla $ nd $ farklı segmentler vardır. Bu bilgi sizi o yoldan en iyi şekilde almalı.