3 डी में गौसियन वितरण प्लॉट करें


10

संभाव्यता सिद्धांत में, सामान्य (या गाऊसी) वितरण एक बहुत ही सामान्य निरंतर संभावना वितरण है। सामान्य वितरण आँकड़ों में महत्वपूर्ण होते हैं और अक्सर प्राकृतिक और सामाजिक विज्ञान में वास्तविक-मूल्यवान यादृच्छिक चर का प्रतिनिधित्व करने के लिए उपयोग किए जाते हैं जिनके वितरण का पता नहीं होता है।

चुनौती

आपकी चुनौती 3-आयामी विमान पर गाऊसी वितरण की संभावना घनत्व की साजिश करना है । इस फ़ंक्शन को इस प्रकार परिभाषित किया गया है:

कहाँ पे:




एक = 1, σ x = σ y = σ

नियम

  • आपका कार्यक्रम एक इनपुट रखना चाहिए σ , मानक विचलन।
  • आपका कार्यक्रम उच्चतम गुणवत्ता में गौसियन वितरण का 3 डी प्लॉट प्रिंट करना चाहिए जैसा कि आपकी भाषा / प्रणाली अनुमति देती है।
  • आपका प्रोग्राम प्रत्यक्ष गौसियन वितरण या प्रायिकता घनत्व बिलिन का उपयोग नहीं कर सकता है।
  • आपके कार्यक्रम को समाप्त करने की आवश्यकता नहीं है।
  • आपका प्लॉट काले और सफेद या रंग में हो सकता है।
  • आपके प्लॉट में नीचे की तरफ ग्रिड लाइनें होनी चाहिए। पक्षों पर ग्रिड लाइनें (जैसा कि उदाहरणों में दिखाया गया है) अनावश्यक हैं।
  • आपके प्लॉट को ग्रिड लाइनों के आगे लाइन नंबर रखने की आवश्यकता नहीं है।

स्कोरिंग

में हमेशा की तरह , कम से कम बाइट्स जीत के साथ सबमिशन! जब तक कोई अविश्वसनीय रूप से छोटा और सहज न हो, मैं बटन का उपयोग करके उत्तर को "स्वीकार" कभी नहीं कर सकता।

उदाहरण आउटपुट

आपका आउटपुट कुछ इस तरह दिख सकता है:

5

या यह इस तरह दिख सकता है:

6

अधिक वैध आउटपुटअमान्य आउटपुट


मुझे भ्रम था कि आपने एक्स-अक्ष के लिए केवल फ़ंक्शन दिखाया। क्या हमें X और Y सिग्मा और म्यू के लिए अलग इनपुट / आउटपुट लेने की जरूरत है?
स्कॉट मिलनर

तो क्या हम मान सकते हैं कि μ 0 के बराबर है? और आपको x और y के लिए किस पैमाने की आवश्यकता है? यदि x और y- पर्वतमाला को then के सापेक्ष बहुत छोटा चुना जाता है, तो ग्राफ़ अनिवार्य रूप से एक स्थिर फ़ंक्शन की तरह दिखेगा।
ग्रेग मार्टिन

(द्वि-आयामी वितरण के लिए, मुझे लगता है कि यदि आप उपयोग करते हैं तो यह स्पष्ट है। x-μ | ^ ^ परिभाषा में 2 के बजाय (x-μ) ^ 2।)
ग्रेग मार्टिन

@GregMartin संपादित।
एमडी एक्सएफ

2
अभी भी स्पष्ट नहीं है ... x_o और y_o और are क्या हैं?
ग्रेग मार्टिन

जवाबों:


7

Gnuplot 4, 64 62 61 60 47 बाइट्स

( Mathematica के साथ बंधे ! WooHoo!)

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

उपरोक्त कोड को एक फ़ाइल में सेव करें जिसे नाम दिया गया है A.gpऔर इसे निम्नलिखित के साथ संलग्न करें:

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

जहां $1मूल्य के साथ प्रतिस्थापित किया जाना है σ। यह वर्तमान आउटपुट निर्देशिका में वांछित आउटपुट .pngनाम की फ़ाइल को बचाएगा GnuPlot3D.png

ध्यान दें कि यह केवल Gnuplot 4 के वितरण के साथ काम करता है क्योंकि Gnuplot 5 में $nतर्क के संदर्भों को हटा दिया गया था और दुर्भाग्य से अधिक क्रिया के साथ बदल दिया गया था ARGn

के साथ नमूना उत्पादन σ = 3:

नमूना आउटपुट

यह आउटपुट ओपी के अनुसार ठीक है ।


Gnuplot 4, वैकल्पिक समाधान, 60 बाइट्स

यहां एक वैकल्पिक समाधान है जो पिछले एक की तुलना में अधिक लंबा है, लेकिन आउटपुट मेरी राय में बहुत बेहतर है।

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

यह अभी भी पिछले समाधान के रूप में एक ही कारण के लिए Gnuplot 4 की आवश्यकता है।

के साथ नमूना उत्पादन σ = 3:

नमूना आउटपुट # 2


I am not sure if it molds to the specifications requiredआपको क्या लगता है कि यह क्या नहीं है?
एमडी एक्सएफ

@MDXF सबसे पहले, मुझे यकीन नहीं है कि ग्राफ की पारदर्शिता ठीक है। मैं ईमानदारी से इसे पसंद नहीं करता हूं, यही वजह है कि मुझे यकीन नहीं था कि यह यहां ठीक होगा। दूसरे, ग्राफ़ डिफ़ॉल्ट रूप से नीचे से एक इकाई ऊंचा शुरू होता है, और मुझे यकीन नहीं है कि यह सब ठीक है या नहीं। तीसरा, क्योंकि ग्राफ एक यूनिट ऊंचा शुरू होता है, मुझे यकीन नहीं है कि मूल पोस्ट में दिए गए ग्राफ की तुलना में ग्राफ की असमानता सभी ठीक है। हालांकि, अगर यह आपके साथ ठीक है, तो मैं खुशी से इसे मुख्य उत्तर दूंगा।
आर। कप

@MDXF वास्तव में, मैं इसे मूल उत्तर के रूप में पोस्ट करने जा रहा था, लेकिन इन कारणों से मैंने इसके बजाय वर्तमान उत्तर द्वारा नहीं चुना और पोस्ट किया।
आर। काप

@MDXF वास्तव में, अगर यह ठीक है तो मैं इसे और भी छोटा बना सकता हूं । मैं समझता हूँ कि यह नहीं होगा, लेकिन यह पूछने के लिए चोट नहीं करता है। यह बिना किसी पर्यावरण संशोधन के Gnuplotसिग्मा के साथ गाऊसी वितरण की संभावना घनत्व को तय करने का डिफ़ॉल्ट तरीका है 2
आर। कप

@MDXF मुझे लगता है कि मैं अपना मूल उत्तर पोस्ट करने से पहले पूछ सकता था, लेकिन उस समय मैं उत्तर पोस्ट करने के लिए बहुत उत्सुक था।
आर। कप

14

सी ++, 3477 3344 बाइट्स

बाइट काउंट में अनावश्यक न्यूलाइन्स शामिल नहीं हैं।
एमडी एक्सएफ ने 133 बाइट्स हासिल की।

कोई तरीका नहीं है C ++ इसके लिए प्रतिस्पर्धा कर सकता है, लेकिन मुझे लगा कि चुनौती के लिए एक सॉफ्टवेयर रेंडर लिखने में मज़ा आएगा। मैंने 3 डी गणित के लिए जीएलएम के कुछ अंशों को फाड़कर बाहर निकाल दिया और ज़स्टोलिनेशन के लिए ज़ियाओलिन वू की लाइन एल्गोरिथम का उपयोग किया । कार्यक्रम पीजीएम फ़ाइल नाम के परिणाम को आउटपुट करता है g

उत्पादन

#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 विश्व अंतरिक्ष में ग्रिड के एक तरफ की लंबाई है।
  • c ग्रिड के प्रत्येक किनारे के साथ कोने की संख्या है।
  • ग्रिड बनाने वाले फ़ंक्शन को दो इनपुट्स लेने वाले फ़ंक्शन के साथ कहा जाता है, xऔर z(+ y ऊपर जाता है) वर्टेक्स की विश्व अंतरिक्ष निर्देशांक, और वर्टेक्स की विश्व अंतरिक्ष स्थिति को वापस करता है।
  • w pgm की चौड़ाई है
  • h pgm की ऊंचाई है
  • mदृश्य / प्रक्षेपण मैट्रिक्स है। तर्क बनाने के लिए उपयोग किया जाता है m...
    • रेडियंस में देखने का क्षेत्र
    • pgm का पहलू अनुपात
    • क्लिप प्लेन के पास
    • दूर क्लिप विमान
    • कैमरा स्थिति
    • कैमरा लक्ष्य
    • सदिश

रेंडरर के पास आसानी से अधिक सुविधाएँ, बेहतर प्रदर्शन और बेहतर गोल्फ हो सकता है, लेकिन मैंने अपनी मस्ती की है!


2
वाह, यह अविश्वसनीय है!
एमडी एक्सएफ

1
बिल्कुल नहीं ... इसके लिए जाओ!
पैट्रिक पर्सल

1
वहाँ तुम जाओ, 133 बाइट्स!
एमडी एक्सएफ

1
यह भयानक है! यदि आप मुझे बता सकते हैं कि आपने कहां से सीखा है, तो यह बहुत अच्छा होगा !
HatsuPointerKun

1
@HatsuPointerKun खुशी है कि आप इसका आनंद लेते हैं! यह ट्यूटोरियल ... opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices ... शुरू करने के लिए एक शानदार जगह है।
पैट्रिक पर्ससेल

9

मैथेमेटिका, 47 बाइट्स

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

इनपुट σ के रूप में लेता है

इनपुट

[2]

उत्पादन
यहाँ छवि विवरण दर्ज करें

-2 बाइट्स LLLAMnYP को धन्यवाद


1
गणितज्ञ जीत? कोई आश्चर्य नहीं: पी
एमडी एक्सएफ

3
2 बाइट्स की बचतE^(-(x^2+y^2)/2/#^2)
LLlAMnYP

6

आर, 105 102 87 86 बाइट्स

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

STDIN से सिग्मा लेता है। से एक सदिश बनाता -6करने 6के चरणों में .1दोनों के लिए xऔर y, फिर एक बनाता है 121x121के बाहरी उत्पाद लेने के द्वारा मैट्रिक्स xऔर y। यह matrixआयामों को कॉल करने और निर्दिष्ट करने से छोटा है । मैट्रिक्स अब पहले से ही भरा हुआ है, लेकिन यह ठीक है, क्योंकि हम ओवरराइट कर रहे हैं।

forमें मूल्यों पर -loop छोरों x, में vectorized संचालन का इस्तेमाल कर रही Rहै, एक बार में एक ही पंक्ति घनत्व मैट्रिक्स का निर्माण।

(s)applyफिर से वेक्टर किए गए कार्यों के लिए एक छोटी विधि है। नायक की तरह, यह मैट्रिक्स का निर्माण सभी को संभालता है, काफी कुछ बाइट्स बचाता है।

यहाँ छवि विवरण दर्ज करें

128 125 110 109 बाइट्स, लेकिन जिस तरह से अधिक फैंसी:

यह प्लॉट plotlyपैकेज द्वारा बनाया गया है । अफसोस की बात है कि यह स्पेसिफिकेशन थोड़ा बुरा है, इसलिए इसमें बहुत सारे बाइट्स खर्च होते हैं। परिणाम वास्तव में वास्तव में हालांकि फैंसी है। मैं अत्यधिक इसे अपने लिए आजमाने की सलाह दूंगा।

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


मैंने इस सवाल में निर्दिष्ट किया कि ग्राफ में लाइन नंबर की आवश्यकता नहीं है, आपका दूसरा सबमिशन ठीक है।
एमडी एक्सएफ

ओह, मुझे वह याद करना चाहिए। मैंने अपने समाधानों की अदला-बदली की। मुझे लगता है कि plotlyकथानक फैंसी है जो अभी भी यहां शामिल है।
JAD

खैर, दोनों मेरी तुलना में बहुत अधिक कट्टर हैं : पी
एमडी एक्सएफ

चूंकि आप केवल sएक बार उपयोग करते हैं , क्या आप शुरू में कर सकते हैं 2*scan()^2और निकाल सकते हैं s=scan();? यह 3 बाइट्स बचाएगा।
केसमार्ट

6

अप्लेसॉफ्ट बेसिक, 930 783 782 727 719 702 695 637 बाइट्स

-72 बाइट्स और मेरी त्रुटि और एक छोटे एल्गोरिथ्म को सीलिंगकैट के लिए एक कार्यशील कार्यक्रम धन्यवाद

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

यहाँ अनप्लग्ड संस्करण।

जब इनपुट दिया गया 1:

इनपुट -1

जब इनपुट दिया गया 2:

इनपुट -2


1
यह अभी तक फिर से BASIC की श्रेष्ठता को दर्शाता है ....

कुछ और बचा सकता है इस तरह के 10 के रूप में भी कुछ अक्सर प्रयुक्त मूल्य के लिए एक या अधिक चरों, की स्थापना करके बाइट्स, की जगह का सुझाव देते हैं EXP(X)/(2*3.14159*S1*S1)साथEXP(X)*M
ceilingcat
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.