(Uyarlanabilir?) Fonksiyon grafiği için algoritmalar


21

Tekilliği olan veya olmayan fonksiyonlar için standart 2d-grafikler çizmek için algoritmalar arıyorum. Amaç bir "Mini-CAS" yazmak, bu yüzden kullanıcıların grafik türlerini önceden bilmek istemiyorum.

Bu problem çok eski, bu yüzden literatürde bazı standart algoritmalar olması gerektiğini düşünüyorum. Bir keresinde Google üzerinden referans bulmakta pek başarılı olamadım.

"Adaptive function plotting" (Uyarlamalı fonksiyon grafiği) adlı "YACAS - algoritmalar kitabı" ndan ilginç bir algoritma buldum .

Yani kısacası:

  • Standart algoritmalar var mı?
  • Çizilmesi zor bilinen işlevler için bir test paketi var mı?
  • Okumak için ilginç makaleler nelerdir?

2
Belki de soru, "grafik çizim" yerine "fonksiyon grafiği" ile daha iyi anlaşılabilir mi? Baştaki başlığı yanlış yorumladım (grafik teorisi).
astrojuanlu

@ Juanlu001 Öneri için teşekkürler. Başlığı değiştirdim.
soegaard

2D derken, gibi bir değişkenli bir fonksiyonu çizmek mi istiyorsunuz yoksa 2D'de gösterilen, örneğin farklı renkler / tonları gösteren iki değişkenli bir fonksiyonla ( ) ilgileniyor musunuz? farklı değerler? f ( x , y )f(x)f(x,y)
Szabolcs

Yani, bir değişkenin fonksiyonunu çizmek istedim. Bununla birlikte, iki değişkenli bir ortamda da hangi noktaların değerlendirileceğini seçmek için algoritmalar duymak isterim. Renkleri ve gölgelemeyi duymakla ilgilenmiyorum.
soegaard

2D fonksiyonlar için sorumu ve cevabını burada gör . Orada yaptıklarım oldukça sınırlıydı ve keyfi işlev için bu kadar iyi çalışmaz. Ayrıca, yöntemin doğru bir şekilde birleşmeyeceği açıklamada eksik olan bazı önemli adımlar vardır: Ağın her kenarının ortasına, bir sonraki yeniden yönlendirmede kaybolacak yeni bir örnekleme noktası eklemem gerekiyordu. (devam)
Szabolcs

Yanıtlar:


10

Mathematica'nın uyarlanabilir örnekleme yordamını GitHub'da uyguladım (Bu tek bir C dosyası, başlık dosyasının kaynak ağacına gitmesi). Rutin bir tanımını uzun zaman önce Mathematica'daki büyük bir kitapta buldum ve bir süredir bu uygulamadaki varyasyonları kullanıyorum. Temel olarak, ilgi alanı üzerinde kaba bir doğrusal numune yapar, daha sonra yüksek eğrilikli bölgeleri rafine etmek için geri gider. Bazı çok keskin özelliklerin kaçırılması mümkündür, ancak pratikte bunu son derece nadir buluyorum. Bu dosya aynı zamanda paralel sürümü de içerir.


1
Bu hangi kitap? Bağladığım kişi mi? Uygulamalarında 5. ve 6. sürümler arasında tam olarak neyin değiştiğini biliyor musunuz?
Szabolcs

1
@Szabolcs: Hayır, bu kitap bölüm 4.1.3'de olduğuna inanıyorum . Bu açıklama Mathematica'nın çok eski bir versiyonunu uygular. Yeni sürümler (belki v6'dan başlayarak) dikey asimptotları algılar ve sahte dikey çizgileri çiziklerden kaldırır. Yeni sürümler kesinlikle süreksizliklerle, tanımsız bölgelerle ve dallanmalarla baş etmek için birçok karmaşık sembolik ön işleme yapıyor.
Victor Liu

Bahsettiğiniz sembolik ön işleme, belgelerde "dışlama algılama" olarak adlandırılır. Exclusions -> Noneİşlevinizin yapısını, Plotonu tanımlayarak ondan veya gizleyerek kapatabilirsiniz f[x_?NumericQ] := .... Değişiklikleri sorduğumda bahsettiğim şey bu değildi. Algoritmada bazı değişiklikler olduğuna inanıyorum, v5 ve v6 farklı noktalarda örneklenmiş. Şu anda tekrar karşılaştırmak için v5'te test yapamıyorum.
Szabolcs

"Mathematica Grafik Kılavuzu", sorunun çok iyi bir tartışmasını içeriyordu. Algoritmanın kısa yollarının da tanımlanmasından özellikle hoşlandım.
soegaard

GitHub dosyasını artık bulamıyorum, taşındı mı?
Andrei

12

Başka CAS'ların bunu nasıl yaptığını bilmek size yardımcı olabilir.

f(x)(x(t),y(t))f(x)

  1. Çizim alanı üzerinde düzenli aralıklarla bir nokta ızgarası ile başlayın. Hemat Mathematica'da kaç tane aranacağını kontrol etmek için bir parametre var PlotPoints.)

  2. (x1,f(x1)),(x2,f(x2)),(x3,f(x3))x1+x22x2+x32

  3. Henüz yineleme sınırına ulaşmadıysak ( MaxRecursionMathematica'da ayarlandı ), 2. adımdan itibaren tekrarlayın.

Bunlardan bazıları, burada Google Kitaplar'da görebileceğiniz Stan Wagon'un Mathematica Eyleminde kitabında tartışılmaktadır .

Hesaplama fonksiyonumun ne kadar pahalı değerlendirildiği üzerinde daha fazla kontrol sahibi olmak için bu algoritmayı daha önce uyguladım. İşte 2. adımın Mathematica kodu:

nd[{points_, values_}] :=
Transpose@{(Drop[points, 1] + Drop[points, -1])/2,
Differences[values]/Differences[points]}

subdivide1d[result_, resolution_, maxAngle_: 10] :=
  Module[
    {deriv, angle, dangle, pos, nf},
    deriv = nd[result\[Transpose]];
    angle = ArcTan[#2] & @@@ deriv;
    dangle = Differences[angle];
    pos = Flatten@Position[dangle, d_ /; Abs[d] > maxAngle/180 Pi];
    pos = Union[pos, pos + 1];
    nf = Nearest[result[[All, 1]]];
    Select[deriv[[pos, 1]], Abs[# - First@nf[#]] > resolution &]
  ]

7

Fonksiyon Grafikleri ile ilgili MathWorld web sayfası , uyarlanabilir fonksiyon çizimi ile ilgili gibi görünen birçok makaleye referanslar içermektedir. Sayfadan alıntı:

Grafik çizme için iyi rutinler, işlevin en hızlı şekilde değiştiği bölgelerde daha fazla nokta çizen uyarlamalı algoritmalar kullanır (Wagon 1991, Math Works 1992, Heck 1993, Wickham-Jones 1994). Tupper (1996) bir algoritma geliştirdi [...]

Öte yandan, Google’da bir makaleye rastladım

www.cs.uic.edu/~wilkinson/Publications/plotfunc.pdf

Bu, etki alanını ve diğer şeyleri nasıl doğru seçeceğinizi açıklar. Umarım sizin için yararlıdır.


1

Bu konuyu buldum ve bunu Julia kütüphanesine Plots.jl'ye eklemek için geliştirici sorunu sayfasını paylaşmam gerektiğini düşündüm . Mathematica'nın uygulama notlarından başlayarak neyin iyi sonuç vereceğini görmek için birkaç teknik denedik. Bazı budama ekleme, aralıklı uç noktalarda tam olarak başlamaması için küçük bir bozulma, bir özyineleme sınırı ve bir çift örgü hata tahmincisi "tam olarak doğru" almak için gerekliydi. İş parçacığı ayrıca sizi uygulama için açık kaynak koduna yönlendirir. Bu yüzden biraz tweaking aldı, ancak bu özelliklerin eklenmesi onu oldukça sağlam hale getirdi (konuya göre testlere göre).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.