2016-07-13 13 views
-1

Ich versuche, ein paar Gleichungen zu integrieren, aber das Programm kompiliert nicht. Die Fehlermeldung, die angezeigt wird, sagt: "zu viele Argumente, um pow zu funktionieren"Zusammensetzung der "pow" -Funktionen in C

Ich werde den problematischen Teil des Codes zeigen und dann zwei spezifische Fragen stellen.

#include <stdio.h> 
#include <math.h> 


struct Par{ 
    double gamma1, gamma2; 
} aa; 



void ecuaciones(int n, double v[], double dv[], double t){ 
dv[0]=v[6] ; 

dv[1]=v[7] ; 

dv[2]=v[8] ; 

dv[3]=v[9] ; 

dv[4]=v[10] ; 

dv[5]=v[11] ; 

dv[6]= aa.gamma1*(v[3]-v[0])*pow((pow(v[0]-v[3], 2)+pow(v[1]-v[4], 2)+pow(v[2]-v[5], 2)), -1,5) ; 

dv[7]= aa.gamma1*(v[4]-v[1])*pow((pow(v[0]-v[3], 2)+pow(v[1]-v[4], 2)+pow(v[2]-v[5], 2)), -1,5) ; 

dv[8]= aa.gamma1*(v[5]-v[2])*pow((pow(v[0]-v[3], 2)+pow(v[1]-v[4], 2)+pow(v[2]-v[5], 2)), -1,5) ; 

dv[9]= -aa.gamma2*(v[3]-v[0])*pow((pow(v[0]-v[3], 2)+pow(v[1]-v[4], 2)+pow(v[2]-v[5], 2)), -1,5) ; 

dv[10]= -aa.gamma2*(v[4]-v[1])*pow((pow(v[0]-v[3], 2)+pow(v[1]-v[4], 2)+pow(v[2]-v[5], 2)), -1,5) ; 

dv[11]= -aa.gamma2*(v[5]-v[2])*pow((pow(v[0]-v[3], 2)+pow(v[1]-v[4], 2)+pow(v[2]-v[5], 2)), -1,5) ; 

So ... das Problem ist in den dv's von 6 bis 11. Die Fragen sind folgende:

Ist es in Ordnung, die „pow“ -Funktion in diesem Fall zu verwenden, oder ist es gerade für konstante Basen definiert? Wenn die Antwort ja ist (was ich fast sicher bin), dann erscheint der folgende Zweifel: Wie kann ich eine pow-Funktion mit einer anderen zusammensetzen?

Aus Gründen der Klarheit ist das, was ich will, eine Zusammensetzung von „pow“ Funktionen zum Ausdruck bringen mit: enter image description here

Beachten Sie, dass wurde leider mindestens einen Weg, um dieses Problem zu gehen: das schreiben ist die quadrierten Terme von der Basis in der Form A * A = A quadriert anstelle von pow. Angesichts der Tatsache, dass die Basis zu einer nicht-ganzzahligen Macht erhoben werden kann, ist meiner Meinung nach die allgemeine Falllösung immer noch sehr wichtig.

+0

Wenn ich die Parens nicht auf meinem winzigen Tablettbildschirm zähle, wird der umschließende pow() -Aufruf mit 3 Args übergeben. –

+1

Sollte '-1,5'' -1.5' sein? Sie können nicht 3 Argumente für die Funktion "pow" haben. – thelaws

+0

Ja, es war tatsächlich ein Tippfehler. Thx für Ihre Zeit –

Antwort

0

Es ist in Ordnung, die Funktion pow in diesem Fall zu verwenden.

Sie erhalten einen Fehler, weil Ihre äußeren pow-Funktionen jeweils drei Argumente haben, wenn pow nur zwei Argumente akzeptiert.

pow((pow(v[0]-v[3], 2)+pow(v[1]-v[4], 2)+pow(v[2]-v[5], 2)), -1,5) 

vereinfacht zu

pow(some_number, -1, 5) 

So dies so festgelegt werden muss, dass pow eine Basis und einen Exponenten nur.

+0

Oh, ich sehe ... tatsächlich, wenn Sie das Bild überprüfen, das ich hochgeladen habe, sollte es ein 3/2 = 1.5 sein. Es war ein Tippfehler. –

+0

@Gato Mazzei Erwarten Sie nicht, dass die Links zu externen URLs in einem Beitrag verwendet werden. Veröffentlichen Sie relevante Daten hier. – chux

2

Alle -1,5 zu -1.5 ändern. Ich nehme an, Sie versuchen, Kräfte zu 3/2 zu berechnen.

+0

Das hat es behoben. Vielen Dank! Stupid typo ... –

+0

Beachten Sie, dass Sie 'pow (n, 2)' als 'double sqr (n) {return n * n; } ', und dann erhalten Sie' pow (sqr (v [0] - v [3]) + sqr (v [1] - v [4]) + sqr (v [2] - v [5])), -1.5) '. Beachten Sie auch, dass 'pow (n, -1.5)' äquivalent zu '1.0/(n * sqrt (n))' ist. –