Problem bei Weitergabe von Array an Funktion?
-
Hallo
Ich versuche die Pfaffsche Determinante einer Matrix in Abhängigkeit des (Wellen)vektors k = kx, ky, kz zu bestimmen und mir die Werte kx,ky,kz ausgeben zu lassen, für die mein Ausdruck Pfaff = 0 ist. Ich habe auch eine Ausgabe - die Werte sind jedoch definitiv keine Nullstellen meiner Funktion (ein Ausgabevektor ist bspw 0,0,0 - Pfaff hat aber einen "y-Achsenabschnitt" ungleich 0...). Ich vermute, dass ich die Arrayeinträge falsch an meine Funktion übergebe? Für Hilfe wäre ich sehr dankbar! Hier der relevante Part meines Codes:#include <iostream> #include <math.h> #include <numeric> #include <fstream> #include <omp.h> #include <boost/array.hpp> #include <boost/numeric/odeint.hpp> using namespace std; ofstream data("data_BFS_quintet.txt"); const double hbar = 6.582119e-01; // Planck constant (meV*ps) const double m = 511e03; //electron mass (meV) const double beta = 2.00104e-06; //spin-orbit coupling (meV) const double alpha = pow(hbar,2)/(2*m)-beta/2; const double kB = 0.0861733; // Boltzmann constant (meV/K) const double mu = 50.0; //chemical potential (meV) const double Delta_0 = 2.0; //post-quench gap parameter const double a = 15; const int Nx = 19; const int Ny = 19; const int Nz = 19; double kx_e[Nx]; double ky_e[Ny]; double kz_e[Nz]; double E_p(double alpha, double beta, double mu, double kx, double ky, double kz){ return (alpha + 9/4*beta)*(pow(kx,2)+pow(ky,2)+pow(kz,2))-mu; } double E_m(double alpha, double beta, double mu, double kx, double ky, double kz){ return (alpha + 1/4*beta)*(pow(kx,2)+pow(ky,2)+pow(kz,2))-mu; } double c_xz(double beta, double kx, double kz){ return sqrt(3)*beta*kx*kz; } double c_yz(double beta, double ky, double kz){ return sqrt(3)*beta*ky*kz; } double Pfaff(double kx, double ky, double kz, double Delta_0){ return pow(E_p(kx, ky, kz, alpha, beta, mu)*E_m(kx, ky, kz, alpha, beta, mu),2)+4*pow(Delta_0,2)*(E_p(kx, ky, kz, alpha, beta, mu)*E_m(kx, ky, kz, alpha, beta, mu)+pow(c_xz(kx,kz,beta),2)+pow(c_yz(ky,kz,beta),2)); } void write_data(double x, double y, double z) { data << x << '\t' << y << '\t' << z << endl; cout << x << '\t' << y << '\t' << z << endl; } int main(){ double ke_xlimits[2] = {-a, a}; double ke_ylimits[2] = {-a, a}; double ke_zlimits[2] = {-a, a}; kx_e[0] = ke_xlimits[0]; ky_e[0] = ke_ylimits[0]; kz_e[0] = ke_zlimits[0]; for(int i = 0; i < Nx; i++){ kx_e[i] = kx_e[0] + i*(ke_xlimits[1]-ke_xlimits[0])/(Nx-1); for(int j = 0; j < Ny; j++){ ky_e[j] = ky_e[0] + j*(ke_ylimits[1]-ke_ylimits[0])/(Ny-1); for(int l = 0; l < Nz; l++){ kz_e[l] = kz_e[0] + l*(ke_zlimits[1]-ke_zlimits[0])/(Nz-1); if(Pfaff(kx_e[i], ky_e[j], kz_e[l], Delta_0) == 0) { double x = kx_e[i]; double y = ky_e[j]; double z = kz_e[l]; write_data(x, y, z); continue; } } } } return 0; }
-
du rufst die funktionien doch gar nicht auf, oder sehe ich da irgendwas falsch?
-
@Wade1234 Du meinst die Funktion Pfaff? Die rufe ich nur in Z. 54 mit der If Schleife auf...(?)
-
@redpottpotter
https://ideone.com/SQg3Zl
Du solltest Code posten, der sich zumindest kompilieren lässt.
Dann würde auch eine realistische Chance bestehen, dass sich einige etwas näher damit beschäftigen.
-
@redpottpotter achso. ja deine formatierung bzw. dein coding-stil generell ist schlecht, daher kann man das halt schonmal übersehen. ich mach das immer so, dass ich 5 leerzeichen eingebe, die dann mit strg-c in die zwischenablage kopiere und mit strg-v dann einrücke.
also die variablen i, j und l sind bei aufruf von pfaff nicht mehr gültig und in der l-schleife wird immer das gleiche ausgeführt. vielleicht liegt es daran.
-
@redpottpotter sagte in Problem bei Weitergabe von Array an Funktion?:
9/4*beta
Ich würde darauf tippen, dass du hier ein anderes Ergebnis erwartest, als du bekommst.
=> Teste jede Funktion einzeln, ob du wirklich das Ergebnis bekommst, dass du erwartest.Edit: Um auch produktiv zu helfen, vergleich das mal mit: 9/4. * beta
-
@Wade1234 Was meinst du mit "Sind bei Abruf von Pfaff nicht mehr gültig"? Was muss ich ändern, damit sie noch gültig sind, bzw um das jeweils "aktuelle" i,j,l an Pfaff zu übergeben?
-
Du zeigst nicht den echten Code.
-
@manni66 doch schon...(?)
-
@redpottpotter naja wenn du so eine schleife hast
for(int i = 0; i < 10; i++) { //mach irgendwas }
dann existiert i danach eigentlich nicht mehr, weil es nur für die schleife deklariert ist. eigentlich dürfte das so gar nicht kompilieren bzw. für zeile 74ff müsstest du einen fehler bekommen, oder bin ich grad irgendwie blöd?
-
@Schlangenmensch zu dem Edit: dann bekomme ich einen error " 'beta' cannot be used as a member pointer since it is of type 'double' "
-
@Wade1234 Aber meine if Abfrage steht ja innerhalb der for Schleife, also
for(int i = 0; i<10; i++){
if (){...}
}
dann müsste das i doch noch definiert sein weil ich die Schleife noch nicht verlassen habe oder?
Einen Fehler bekomme ich jedenfalls nicht
-
Nein! Das wird nicht übersetzt.
-
@redpottpotter sagte in Problem bei Weitergabe von Array an Funktion?:
@Schlangenmensch zu dem Edit: dann bekomme ich einen error " 'beta' cannot be used as a member pointer since it is of type 'double' "
dann schreib mal
9.0 / 4.0 * beta
, immer den wert hinter dem komma mit angeben.@redpottpotter sagte in Problem bei Weitergabe von Array an Funktion?:
@Wade1234 Aber meine if Abfrage steht ja innerhalb der for Schleife, also
for(int i = 0; i<10; i++){
if (){...}
}
dann müsste das i doch noch definiert sein weil ich die Schleife noch nicht verlassen habe oder?
Einen Fehler bekomme ich jedenfalls nichtaber du rufst ja danach
if(Pfaff(kx_e[i], ky_e[j], kz_e[l], Delta_0) == 0) { double x = kx_e[i]; double y = ky_e[j]; double z = kz_e[l]; write_data(x, y, z); continue; }
auf und eigentlich sollten i, j und l da nicht mehr deklariert sein.
-
@redpottpotter Das kommt aus deinem entsprechenden Kontext. Vergleiche die Aufrufe mal. (E2_p ist die Kopie von dir).
#include <iostream> #include <cmath> double E_p(double alpha, double beta, double mu, double kx, double ky, double kz){ return (alpha + 9/4.*beta)*(pow(kx,2)+pow(ky,2)+pow(kz,2))-mu; } double E2_p(double alpha, double beta, double mu, double kx, double ky, double kz){ return (alpha + 9/4*beta)*(pow(kx,2)+pow(ky,2)+pow(kz,2))-mu; } int main() { auto e = E_p(2,2,2,2,2,2); auto e2 = E2_p(2,2,2,2,2,2); std::cout << e << std::endl; std::cout << e2 << std::endl; } }
-
@Wade1234 ok und wie mache ich, dass in meiner if Abfrage die jeweiligen Werte kx_e[i], ky_e[j], kz_e[l] aus den for Schleifen in denen ich mich befinde benutzt werden? Das verstehe ich gerade nicht ganz
-
@redpottpotter sagte in Problem bei Weitergabe von Array an Funktion?:
@Wade1234 Aber meine if Abfrage steht ja innerhalb der for Schleife, also
for(int i = 0; i<10; i++){
if (){...}
}
dann müsste das i doch noch definiert sein weil ich die Schleife noch nicht verlassen habe oder?
Einen Fehler bekomme ich jedenfalls nichtDein Code vom Eröffnungspost sieht aber so aus:
for(int i = 0; i < Nx; i++){ kx_e[i] = kx_e[0] + i*(ke_xlimits[1]-ke_xlimits[0])/(Nx-1); } // i-Schleife zu Ende for(int j = 0; j < Ny; j++){ ky_e[j] = ky_e[0] + j*(ke_ylimits[1]-ke_ylimits[0])/(Ny-1); } // j-Schleife zu Ende for(int l = 0; l < Nz; l++){ kz_e[l] = kz_e[0] + l*(ke_zlimits[1]-ke_zlimits[0])/(Nz-1); } // l-Schleife zu Ende // l hätte hier auch den Wert Nz -> Zugriff ausserhalb vom Array. if(Pfaff(kx_e[i], ky_e[j], kz_e[l], Delta_0) == 0) { double x = kx_e[i]; double y = ky_e[j]; double z = kz_e[l]; write_data(x, y, z); continue; }
Du arbeitest mit anderem Code als du hier zeigst. Da kann die keiner helfen.
-
@Schlangenmensch Danke für den Tipp! Habe es jetzt auf 9.0/4.0 geändert und bekomme jetzt nur noch eine einzige Lösung (0,0,0) ausgegeben...
-
@redpottpotter sagte in Problem bei Weitergabe von Array an Funktion?:
@Wade1234 ok und wie mache ich, dass in meiner if Abfrage die jeweiligen Werte kx_e[i], ky_e[j], kz_e[l] aus den for Schleifen in denen ich mich befinde benutzt werden? Das verstehe ich gerade nicht ganz
Was meinst du, wofür die Klammern { } da sind?
-
@DirkB ahh stimmt tut mir leid - ich habe den Code gerade abgetippt weil ich mit meinem Computer gerade keinen Internetzugriff habe. Sorry für die Umstände die If Abfrage steht innerhalb der for Schleifen