270 likes | 527 Views
Schroedingerova jednadžba. Numeričko rješavanje. Linearna diferencijalna jednadžba. Rubni uvjeti. Rubni uvjeti u jednoj točki, Rounge-Kutta metoda. Rubni uvjeti u dvije različite točke. Diskretizacija diferencijalne jednadžbe. i=1. Postoji bolji algoritam koji daje pogrešku reda6
E N D
Schroedingerova jednadžba Numeričko rješavanje
Rubni uvjeti • Rubni uvjeti u jednoj točki, Rounge-Kutta metoda • Rubni uvjeti u dvije različite točke
Postoji bolji algoritam koji daje pogrešku reda6 • Numerova metoda • Ne znamo analitički izraz za y pa neznamo ni derivaciju
Numerička procedurapogađanje i spajanje rješenja • Možemo uzeti bilo koji broj za derivaciju u točki a, i varirati rješenje dok ne pogodimo rubni uvjet u b
Rubni uvjet može biti zadan i implicitno, npr. • Problem divergentnog rješenja • Spajanje rješenja
Schroedingerova jednadžba • supstitucija • separacija
Radijalni dio uz l=0 • Zadan je potencijal
Vezana stanja • Rubni uvjeti • Imamo rješenje za r<a i za r>a
Zbog kontinuiranosti • Uz pokrate • vrijedi
Numerička procedura • Definicija funkcije • Nultočka ove funkcije je svojstvena energija • Newton-Raphsonova metoda daje
Diferencijalna jednadžba ima oblik • Uz oznaku • Diskretizirano:
kod • void schwf_2 (int n, double k,double e, double (*func)(double,double), char b[],double delta) • { • int i,j,s,m; • double *w,*wf; • double nula; • FILE *p; • p=fopen(b,"w"); • nula=bisekcija ( 0.,20., &potencijal2,1.e-10); • printf("nula je %f\n", nula); • w=(double *)malloc((n+1)*sizeof(double)); • wf=(double *)malloc((n+1)*sizeof(double)); • for(i=0;i<n;i++) w[i]=func(e,i*k); • wf[n] = 0.; • wf[0] = 0.; • wf[n-1]= 0.0005*k*k; • wf[1] = -0.4*k*k; • m=0;
do { m++; for (i=n-2;i>0;i--) { wf[i]=(2.-k*k*w[i+1])*wf[i+1]-wf[i+2]; if (fabs(wf[i])>INFINITY) for(j=n;j>=i;j--) wf[j]/=INFINITY; if(k*i<=nula) { s=i+1; break; } } for(i=2;i<=s;i++) { wf[i]=(2.-k*k*w[i-1])*wf[i-1]-wf[i-2]; if (fabs(wf[i])>INFINITY) for(j=0;j<=i;j++) wf[j]/=INFINITY; }
/*popravljanje početnih uvjeta*/ if(wf[s-1]<wf[s+1]) { wf[1]=wf[1]*(1+fabs(wf[s+1]-wf[s-1])/(2.*wf[s])); wf[n-1]=wf[n-1]*(1-fabs(wf[s+1]-wf[s-1])/(2.*wf[s])); } else { wf[1]=wf[1]*(1-fabs(wf[s+1]-wf[s-1])/(2.*wf[s])); wf[n-1]=wf[n-1]*(1+fabs(wf[s+1]-wf[s-1])/(2.*wf[s])); } }while(fabs(wf[s-1]-wf[s+1])>delta&&m<n); for(i=0;i<=n;i++) fprintf(p,"%20.15g %20.15g\n",i*k,wf[i]); delete(w); delete(wf); fclose(p); }