Python

2016-03-31 12 views
1

'deki sonlu elemanlar düğüm noktaları arasındaki verimli ve doğru bir şekilde enterpolasyon yapılması Bazı düğüm noktalarının bulunmadığı noktalardan bir grup bilinen düğüm noktasından bazı 3B sonlu elemanlar stres alanı verilerinin enterpolasyonunu yapmak istiyorum. Düğüm streslerinin gauss noktalarından zaten tahmin edildiğini biliyorum, ancak elimdeki verilerle yapabileceğim en iyi şey bu. Aşağıdaki görüntü 2B bir sunum sağlamaktadır. Kırmızı ve pembe noktalar, değeri enterpolasyon yapmak istediğim yerleri temsil ederdi. Python

Point Set with Red and Pink Unknown values

Başlangıçta ben faiz ve diğer bilinen noktaların noktası içeriyordu küçük sınırlayıcı kutusunu (gövde) veya simplex bulmak düşündüm. Bunu 2B'de görselleştirmek, bunun yanlış bir şekilde yakın bir değerden veriyi görmezden gelebileceğini fark ettim. LindearNDInterpolator scipy'yi kullanmayı planlıyordum ancak bazı unexpected behaviour olduğunu farkettim ve yakınlardaki noktaları daha önce tarif ettiğim gibi dışlayacağından endişeleniyorum. Pembe noktanın yeşil üçgenden nasıl referans alınacağına dikkat edin, ancak muhtemelen daha alakalı olmasına rağmen turuncu üçgenin dışındaki noktayı göz ardı edin.

Triangles around known points

Bildiğim kadarıyla en iyi şekilde söyleyebilirim yakın çevredeki düğümleri almaktır ve mesafeye ağırlıklı ortalama interpolasyon. Hazır bir şey varsa ya da yazılması gerekirse, emin değilim. Bunun oldukça yaygın bir sorun olduğunu düşünürdüm, bu yüzden jantın zaten icat edilmiş olduğunu farzedeyim ...

Aslında benim son hedefim, bir 3D çizgisi için değerleri nokta kümesi aracılığıyla enterpolasyon yapmak/regreslemek.

+0

Radyal temel fonksiyonlar daha iyi bir alternatif midir? –

cevap

0

https://stackoverflow.com/a/36337428/2372254

ilk cevap burada yardımcı oldu ama 1-D örnek yaklaşım aslında p ile bazı garip şeyler yapar gösterir = 1 (verilerden farklı wildest) ve p = 3 bazı garip olsun plateaux.

SciPy'da uygulanan ve JPG'nin kodunu aşağıdaki gibi değiştiren Radial Basis Functions'a bir göz attım.

Modifiye Kod

from pylab import * 
from scipy.interpolate import Rbf, InterpolatedUnivariateSpline 
# imaginary samples 
xmax=10 
Npoints=10 
x=0.1*randint(0,10*xmax,Npoints) 

rtf sıralı listeleri gerektirir:

x.sort() 
y=sin(2*x)+x 
plot(x,y,ls="",marker="x",color="red",label="samples",ms=9,mew=2) 
# interpolation 
x2=linspace(0,xmax,150) # new sampling 
def weight(x,x0,p): # modify this function in 3D 
    return 1/(((x-x0)**2)**(p/2)+0.00001) # 0.00001 to avoid infinity 
y2=zeros_like(x2) 
for p in range(1,4): 
    for i in range(len(y2)): 
     y2[i]=sum(y*weight(x,x2[i],p))/sum(weight(x,x2[i],p)) 
    plot(x2,y2,label="Interpolation p="+str(p)) 
yrbf = Rbf(x, y) 
fi = yrbf(x2) 
plot(x2, fi, label="Radial Basis Function") 
ius = InterpolatedUnivariateSpline(x, y) 
yius = ius(x2) 
plot(x2, yius, label="Univariate Spline") 
legend(loc=2) 
show() 

sonuç benim amaçlanan kullanımına ilginç ve muhtemelen daha uygundur. Aşağıdaki şekil üretildi.

Figure Showing RBF and Univariate Spline example

Ama SciPy (alternatifler google) puan tekrarlanan önemli bir sorun vardır içinde RBF uygulama - Gerçek senaryoda olası değil - ve tamamen balistik gider:

Figure showing ballistic RBF

Pürüzsüzleştirildiğinde (pürüzsüz = 0.1 kullanıldı) tekrar normalleşir. Bu, bazı programlama tuhaflıklarını gösterebilir.

1

Inverse distance weighting deneyebilirsiniz. İşte (3D için kolaylıkla) 1D bir örnektir:

İşte
from pylab import * 
# imaginary samples 
xmax=10 
Npoints=10 
x=0.1*randint(0,10*xmax,Npoints) 
y=sin(2*x)+x 
plot(x,y,ls="",marker="x",color="red",label="samples",ms=9,mew=2) 
# interpolation 
x2=linspace(0,xmax,150) # new sampling 
def weight(x,x0,p): # modify this function in 3D 
    return 1/(((x-x0)**2)**(p/2)+0.00001) # 0.00001 to avoid infinity 
y2=zeros_like(x2) 
for p in range(1,4): 
    for i in range(len(y2)): 
     y2[i]=sum(y*weight(x,x2[i],p))/sum(weight(x,x2[i],p)) 
    plot(x2,y2,label="Interpolation p="+str(p)) 
legend(loc=2) 
show() 

sonuç interpolation result

Gördüğünüz gibi, gerçekten fantastik olmaması. En iyi sonuçlar bence, p = 2 için, ama 3D'de farklı olacak. Gauss ağırlığı ile daha iyi eğriler elde ettim, ama böyle bir seçim için teorik bir arka plana sahip değilim.

+0

Bunun için teşekkürler. Aslında ekipmanın güvenliğini etkileyebilecek iş için kullanmaktan dolayı endişeleniyorum. Radyal temel fonksiyonlarına bakacağım ve neler yapabileceğimi göreceğim. –