Gauss Dağılımını 3B olarak çizin


10

Olasılık teorisinde, normal (veya Gaussian) dağılım çok yaygın bir sürekli olasılık dağılımıdır. Normal dağılımlar istatistiklerde önemlidir ve doğal ve sosyal bilimlerde dağılımları bilinmeyen gerçek değerli rastgele değişkenleri temsil etmek için kullanılır.

Meydan okuma

Buradaki zorluk çizmektir olasılık yoğunluğu Gauss Dağıtım 3 boyutlu düzlemde . Bu işlev şu şekilde tanımlanır:

Nerede:




A = 1, σ x = σ y = σ

kurallar

  • Programınız bir giriş σ , standart sapma almalıdır .
  • Programınız, Gauss Dağılımının 3B çizimini, dilinizin / sisteminizin izin verdiği en yüksek kalitede yazdırmalıdır.
  • Programınız doğrudan Gauss Dağılımı veya olasılık yoğunluğu yerleşikini kullanamaz.
  • Programınızın sona ermesi gerekmez.
  • Çiziminiz siyah beyaz veya renkli olabilir.
  • Grafiğinizin alt kısmında ızgara çizgileri bulunmalıdır. Yanlardaki ızgara çizgileri (örneklerde gösterildiği gibi) gereksizdir.
  • Grafiğinizin ızgara çizgilerinin yanında satır numaralarına sahip olması gerekmez.

puanlama

her zamanki gibi, en az bayt ile gönderme kazanır! İnanılmaz derecede küçük ve sezgisel olmadığı sürece, düğmeyi kullanarak bir yanıtı "kabul edemeyebilirim".

Örnek çıktı

Çıktınız şöyle görünebilir:

5

Veya şu şekilde görünebilir:

6

Daha geçerli çıktılar . Geçersiz çıktılar .


X ekseni işlevini gösterdiğiniz için kafası karışmıştı. X ve Y sigma ve mu'lar için ayrı giriş / çıkışlar almamız gerekiyor mu?
Scott Milner

Öyleyse μ'nin 0'a eşit olduğunu varsayalım mı? Ve x ve y için hangi ölçeğe ihtiyacınız var? X ve y aralıkları σ'ya göre çok küçük seçilirse, grafik temel olarak sabit bir fonksiyona benzeyecektir.
Greg Martin

(İki boyutlu dağılım için, (x-μ) ^ 2 yerine tanımda | x-μ | ^ 2 kullanmanızın daha net olduğunu düşünüyorum.)
Greg Martin

@GregMartin Düzenlendi.
MD XF

2
Hala net değil ... x_o ve y_o ve θ nedir?
Greg Martin

Yanıtlar:


7

Gnuplot 4, 64 62 61 60 47 bayt

( Mathematica ile bağlandı! WooHoo!)

se t pn;se is 80;sp exp(-(x**2+y**2)/(2*$0**2))

Yukarıdaki kodu adlı bir dosyaya kaydedin ve A.gpaşağıdakilerle çağırın:

gnuplot -e 'call "A.gp" $1'>GnuPlot3D.png

burada, $1değeri ile değiştirilir σ. Bu işlem , istenen çıktıyı içeren .pngadlı bir dosyayı GnuPlot3D.pnggeçerli çalışma dizinine kaydeder .

Bunun yalnızca Gnuplot 4'ün dağılımlarıyla çalıştığını unutmayın, çünkü Gnuplot 5'te $nargümanlara atıflar kullanımdan kaldırılmıştır ve maalesef daha ayrıntılı bir ifadeyle değiştirilmiştir ARGn.

Örnek çıktı σ = 3:

Örnek Çıktı

Bu çıkış uyarınca ince ebatlı bir OP .


Gnuplot 4, Alternatif Çözüm, 60 bayt

İşte bir öncekinden çok daha uzun bir alternatif çözüm ama çıktı bence çok daha iyi görünüyor.

se t pn;se is 80;se xyp 0;sp exp(-(x**2+y**2)/(2*$0**2))w pm

Bu yine de önceki çözümle aynı nedenden dolayı Gnuplot 4'ü gerektirir.

Örnek çıktı σ = 3:

Örnek Çıkışı # 2


I am not sure if it molds to the specifications requiredhangi spesifikasyonların karşılanmadığını düşünüyorsunuz?
MD XF

@MDXF Öncelikle grafiğin şeffaflığının iyi olup olmadığından emin değilim. Dürüst olmak gerekirse gerçekten sevmiyorum, bu yüzden burada iyi olup olmayacağından emin değildim. İkincisi, grafik varsayılan olarak alttan bir birim yükseklikte başlar ve bunun da iyi olup olmadığından emin değilim. Üçüncüsü, grafik bir birim yüksekliğe başladığı için, orijinal gönderide verilen grafiklere kıyasla grafiğin orantısızlığının iyi olduğundan emin değilim. Ancak, eğer bu sizin için uygunsa, bunu ana cevap olarak mutlu bir şekilde yapacağım.
R. Kap

@MDXF Aslında, bunu orijinal cevap olarak gönderecektim, ancak bu nedenlerden ötürü mevcut cevabı seçmemeyi ve yayınlamayı seçtim.
R.Kap

Eğer @MDXF Aslında, bence bu da kısa yapabilir bu tamamdır. Olmayacağını anlıyorum, ama sormak acıtmıyor. GnuplotGauss dağılımının olasılık yoğunluğunu 2herhangi bir ortam değişikliği olmadan bir Sigma ile çizmenin varsayılan yolu budur .
R.Kap

@ MDXF Sanırım orijinal cevabımı göndermeden önce sordum, ama o zaman cevap göndermeye çok istekliydim.
R. Kap

14

C ++, 3477 3344 bayt

Bayt sayısı gereksiz yeni satırları içermez.
MD XF 133 baytlık gol attı.

C ++ bunun için rekabet edebilecek hiçbir yolu yoktur, ancak meydan okuma için bir yazılım oluşturucu yazmanın eğlenceli olacağını düşündüm. 3D matematik için bazı GLM parçalarını yırttım ve golf oynadım ve Xiaolin Wu'nun rasterleştirme için çizgi algoritmasını kullandım. Program sonucu adlı bir PGM dosyasına gönderir g.

Çıktı

#include<array>
#include<cmath>
#include<vector>
#include<string>
#include<fstream>
#include<algorithm>
#include<functional>
#define L for
#define A auto
#define E swap
#define F float
#define U using
U namespace std;
#define K vector
#define N <<"\n"
#define Z size_t
#define R return
#define B uint8_t
#define I uint32_t
#define P operator
#define W(V)<<V<<' '
#define Y template<Z C>
#define G(O)Y vc<C>P O(vc<C>v,F s){vc<C>o;L(Z i=0;i<C;++i){o\
[i]=v[i]O s;}R o;}Y vc<C>P O(vc<C>l, vc<C>r){vc<C>o;L(Z i=0;i<C;++i){o[i]=l[i]O r[i];}R o;}
Y U vc=array<F,C>;U v2=vc<2>;U v3=vc<3>;U v4=vc<4>;U m4=array<v4,4>;G(+)G(-)G(*)G(/)Y F d(
vc<C>a,vc<C>b){F o=0;L(Z i=0;i<C;++i){o+=a[i]*b[i];}R o;}Y vc<C>n(vc<C>v){R v/sqrt(d(v,v));
}v3 cr(v3 a,v3 b){R v3{a[1]*b[2]-b[1]*a[2],a[2]*b[0]-b[2]*a[0],a[0]*b[1]-b[0]*a[1]};}m4 P*(
m4 l,m4 r){R{l[0]*r[0][0]+l[1]*r[0][1]+l[2]*r[0][2]+l[3]*r[0][3],l[0]*r[1][0]+l[1]*r[1][1]+
l[2]*r[1][2]+l[3]*r[1][3],l[0]*r[2][0]+l[1]*r[2][1]+l[2]*r[2][2]+l[3]*r[2][3],l[0]*r[3][0]+
l[1]*r[3][1]+l[2]*r[3][2]+l[3]*r[3][3]};}v4 P*(m4 m,v4 v){R v4{m[0][0]*v[0]+m[1][0]*v[1]+m[
2][0]*v[2]+m[3][0]*v[3],m[0][1]*v[0]+m[1][1]*v[1]+m[2][1]*v[2]+m[3][1]*v[3],m[0][2]*v[0]+m[
1][2]*v[1]+m[2][2]*v[2]+m[3][2]*v[3],m[0][3]*v[0]+m[1][3]*v[1]+m[2][3]*v[2]+m[3][3]*v[3]};}
m4 at(v3 a,v3 b,v3 c){A f=n(b-a);A s=n(cr(f,c));A u=cr(s,f);A o=m4{1,0,0,0,0,1,0,0,0,0,1,0,
0,0,0,1};o[0][0]=s[0];o[1][0]=s[1];o[2][0]=s[2];o[0][1]=u[0];o[1][1]=u[1];o[2][1]=u[2];o[0]
[2]=-f[0];o[1][2]=-f[1];o[2][2]=-f[2];o[3][0]=-d(s,a);o[3][1]=-d(u,a);o[3][2]=d(f,a);R o;}
m4 pr(F f,F a,F b,F c){F t=tan(f*.5f);m4 o{};o[0][0]=1.f/(t*a);o[1][1]=1.f/t;o[2][3]=-1;o[2
][2]=c/(b-c);o[3][2]=-(c*b)/(c-b);R o;}F lr(F a,F b,F t){R fma(t,b,fma(-t,a,a));}F fp(F f){
R f<0?1-(f-floor(f)):f-floor(f);}F rf(F f){R 1-fp(f);}struct S{I w,h; K<F> f;S(I w,I h):w{w
},h{h},f(w*h){}F&P[](pair<I,I>c){static F z;z=0;Z i=c.first*w+c.second;R i<f.size()?f[i]:z;
}F*b(){R f.data();}Y vc<C>n(vc<C>v){v[0]=lr((F)w*.5f,(F)w,v[0]);v[1]=lr((F)h*.5f,(F)h,-v[1]
);R v;}};I xe(S&f,v2 v,bool s,F g,F c,F*q=0){I p=(I)round(v[0]);A ye=v[1]+g*(p-v[0]);A xd=
rf(v[0]+.5f);A x=p;A y=(I)ye;(s?f[{y,x}]:f[{x,y}])+=(rf(ye)*xd)*c;(s?f[{y+1,x}]:f[{x,y+1}])
+=(fp(ye)*xd)*c;if(q){*q=ye+g;}R x;}K<v4> g(F i,I r,function<v4(F,F)>f){K<v4>g;F p=i*.5f;F
q=1.f/r;L(Z zi=0;zi<r;++zi){F z=lr(-p,p,zi*q);L(Z h=0;h<r;++h){F x=lr(-p,p,h*q);g.push_back
(f(x,z));}}R g;}B xw(S&f,v2 b,v2 e,F c){E(b[0],b[1]);E(e[0],e[1]);A s=abs(e[1]-b[1])>abs
(e[0]-b[0]);if(s){E(b[0],b[1]);E(e[0],e[1]);}if(b[0]>e[0]){E(b[0],e[0]);E(b[1],e[1]);}F yi=
0;A d=e-b;A g=d[0]?d[1]/d[0]:1;A xB=xe(f,b,s,g,c,&yi);A xE=xe(f,e,s,g,c);L(I x=xB+1;x<xE;++
x){(s?f[{(I)yi,x}]:f[{x,(I)yi}])+=rf(yi)*c;(s?f[{(I)yi+1,x}]:f[{x,(I)yi+1}])+=fp(yi)*c;yi+=
g;}}v4 tp(S&s,m4 m,v4 v){v=m*v;R s.n(v/v[3]);}main(){F l=6;Z c=64;A J=g(l,c,[](F x,F z){R
v4{x,exp(-(pow(x,2)+pow(z,2))/(2*pow(0.75f,2))),z,1};});I w=1024;I h=w;S s(w,h);m4 m=pr(
1.0472f,(F)w/(F)h,3.5f,11.4f)*at({4.8f,3,4.8f},{0,0,0},{0,1,0});L(Z j=0;j<c;++j){L(Z i=0;i<
c;++i){Z id=j*c+i;A p=tp(s,m,J[id]);A dp=[&](Z o){A e=tp(s,m,J[id+o]);F v=(p[2]+e[2])*0.5f;
xw(s,{p[0],p[1]},{e[0],e[1]},1.f-v);};if(i<c-1){dp(1);}if(j<c-1){dp(c);}}}K<B> b(w*h);L(Z i
=0;i<b.size();++i){b[i]=(B)round((1-min(max(s.b()[i],0.f),1.f))*255);}ofstream f("g");f 
W("P2")N;f W(w)W(h)N;f W(255)N;L(I y=0;y<h;++y){L(I x=0;x<w;++x)f W((I)b[y*w+x]);f N;}R 0;}
  • l dünya uzayında ızgaranın bir tarafının uzunluğudur.
  • c , ızgaranın her kenarı boyunca bulunan köşe sayısıdır.
  • Izgarayı oluşturan işlev, iki giriş alan bir işlevle çağrılır, xvez tepe noktasının (+ y kadar gider) dünya boşluk koordinatları ve döner tepe dünya alan konumu.
  • w pgm'nin genişliği
  • h pgm'nin yüksekliği
  • mgörünüm / projeksiyon matrisidir. Oluşturmak için kullanılan argümanlarm ...
    • radyanda görüş alanı
    • pgm'nin en boy oranı
    • küçük uçak yakınında
    • uzak klip düzlemi
    • kamera konumu
    • kamera hedefi
    • vektör kadar

Oluşturucu kolayca daha fazla özelliğe, daha iyi performansa ve daha iyi golf oynamaya sahip olabilirdi, ama eğlendim!


2
Vay canına, bu inanılmaz!
MD XF

1
Hiç de değil!
Patrick Purcell

1
Al bakalım, 133 bayt kapalı!
MD XF

1
Bu müthiş! Bana tüm bunları nereden öğrendiğini söyleseydin , bu harika olurdu !
HatsuPointerKun

1
@HatsuPointerKun Keyfini çıkarın! Bu öğretici ... opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices ... başlamak için harika bir yerdir.
Patrick Purcell

9

Mathematica, 47 bayt

Plot3D[E^(-(x^2+y^2)/2/#^2),{x,-6,6},{y,-6,6}]&

giriş σ olarak alır

Giriş

[2]

çıktı
resim açıklamasını buraya girin

LLlAMnYP sayesinde -2 bayt


1
Mathematica kazanıyor mu? Orada sürpriz yok: P
MD XF

3
E^(-(x^2+y^2)/2/#^2)
LLlAMnYP

6

R, 105 102 87 86 bayt

s=scan();plot3D::persp3D(z=sapply(x<-seq(-6,6,.1),function(y)exp(-(y^2+x^2)/(2*s^2))))

STDIN'den Sigma alır. Bir vektör oluşturur -6için 6adımlarla .1hem xve y, daha sonra bir oluşturur 121x121dış çarpımını almak sureti ile bir matris xve y. Bu, matrixboyutları çağırmak ve belirtmekten daha kısadır . Matris şimdi zaten dolu, ama sorun değil, çünkü üzerine yazıyoruz.

forDeğerleri üzerinde -loop döngüler xiçinde vektörlü işlemleri kullanarak R, her seferinde yoğunluk matrisi bir satır oluşturma.

(s)applyyine vektörize operasyonlar için daha kısa bir yöntemdir. Kahraman gibi, matrisin yaratılmasını tek başına ele alır ve birkaç bayt tasarruf sağlar.

resim açıklamasını buraya girin

128 125 110 109 bayt, ama yol daha fantezi:

Bu çizim plotlypaket tarafından oluşturulur . Ne yazık ki şartname biraz garip, bu yüzden bu çok bayt maliyeti. Sonuç gerçekten çok süslü. Çok kendiniz denemek öneriyoruz.

s=scan();plotly::plot_ly(z=sapply(x<-seq(-6,6,.1),function(y)exp(-(y^2+x^2)/(2*s^2))),x=x,y=x,type="surface")

bla


Ben grafik olmadığını, söz konusu belirtilen değil hat numaralarını olması gerekir, ikinci gönderme gayet iyi.
MD XF

Bunu kaçırmış olmalıyım. Çözümlerimi değiştirdim. plotlyArsa hala burada dahil garanti için yeterince süslü olduğunu düşünüyorum .
JAD

Her ikisi de benimkinden çok daha meraklı : P
MD XF

Sadece bir skez kullandığınız için yapabilir misiniz?2*scan()^2s=scan(); için, başlangıçta ve kaldırabilir ? 3 bayt tasarruf sağlar.
KSmarts

6

Applesoft BASIC, 930 783 782 727 719 702 695 637 bayt

-72 bayt ve benim hatamı tespit tavan kedisi ve kısaltılmış algoritma sayesinde bir çalışma programı

0TEXT:HOME:INPUTN:HGR:HCOLOR=3:W=279:H=159:L=W-100:Z=L/10:B=H-100:C=H-60:K=0.5:M=1/(2*3.14159265*N*N):FORI=0TO10STEPK:X=10*I+1:Y=10*I+B:HPLOTX,Y:FORJ=0TOL STEP1:O=10*J/L:D=ABS(5-I):E=ABS(5-O):R=(D*D+E*E)/(2*N*N):G=EXP(-R)*M:A=INT((C*G)/M):X=10*I+Z*O+1:Y=10*I+B-A:HPLOTTOX,Y:IF(I=0)GOTO4
1IF(J=L)GOTO3
2V=INT(J/10):IF((J/10)<>V)GOTO5
3D=ABS(5-I+K):E=ABS(5-O):R=(D*D+E*E)/(2*N*N):U=EXP(-R)/(2*3.14159*N*N):S=INT((C*U)/M):P=10*(I-K)+Z*O+1:Q=10*(I-K)+B-S:HPLOT TOP,Q:HPLOTX,Y
4IF(J=0)GOTO7:IF(I<10)GOTO5:IF(J=L)GOTO6:V=INT(J/10):IF((J/10)=V)GOTO6
5HCOLOR=0
6HPLOTTOX,10*I+B:HCOLOR=3:HPLOTX,Y
7NEXTJ:NEXTI:HPLOTW+1,H:HPLOTTO101,H:HPLOTTO0+1,H

Burada unngolfed versiyonu.

Girdi verildiğinde 1:

giriş 1

Girdi verildiğinde 2:

Giriş-2


1
Bu yine BASIC üstünlüğünü gösterir ....

Bir veya daha fazla değişkeni 10 gibi sık kullanılan bir değere ayarlayarak birkaç bayt kaydedebilir. Ayrıca,EXP(X)/(2*3.14159*S1*S1)EXP(X)*M
ceilingcat
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.