Wie kann ich meine Methode aufrufen?

Wasserranzen

Aktives Mitglied
Hallo,

Ich habe ein kleines Problem mit meinem Programm. Das Programm soll die Tangentensteigung, für eine Funktion 2.Grades, an einer beliebigen Stelle x_0 berechnen. Das Programm ist soweit fertig, nur schaffe ich es nicht die Methode für die Berechnung aufzurufen.

Weiß jemand vielleicht,wo mein Fehler liegt ? Der Fehler liegt in Zeile 14.

Danke.
Java:
import java.util.Scanner; // t(x) = f'(x_0)*(x-x_0)+f(x_0) = f'(x_0)*x-f'(x_0)*x_0+f(x_0)
public class Tangente
{
    
public static void main(String[]args)
{
Scanner x = new Scanner(System.in);
System.out.println("Bitte geben Sie die Stelle ein.");
int x_0 = x.nextInt();
System.out.println("Geben Sie die Koeffizienten ein.");   
int a = x.nextInt();
int b = x.nextInt();
int c = x.nextInt();
System.out.println("Die Tangente an der Stelle"+x_0+"lautet:"+TangenteR(AbleitungS,Funktionswert,x_0,x));
}
    
public static int AbleitungX(int a)   
{
    
int Ableitung = a*2;

return Ableitung;
    
}
    
public static int AbleitungX2(int b)
{
    int Ableitung2 = b;
    return Ableitung2;
}
    
public static int AbleitungS(int x_0,int a, int b )
{
    
int AbleitungS = AbleitungX(a)*x_0+AbleitungX2(b);   

    
    return AbleitungS;
    
}
    
public static int Funktionswert(int a,int b,int c, int x_0)   
{
    
int Funktionswert = a*x_0+x_0+b*x_0+c;   
    
return Funktionswert;   
}
    
public static int TangenteR(int AbleitungS, int Funktionswert,int x,int x_0)   

{
    
int Tangente = AbleitungS*x-AbleitungS*x_0+Funktionswert;   
    
    
return Tangente;   
}
    
    
    
    
    
    
}
 
Ich habe es jetzt so gemacht.
Java:
System.out.println
("Die Tangente an der Stelle"+" "+ x_0+"lautet:"+TangenteR(AbleitungS(x_0,a,b),Funktionswert(a,b,c,x_0),x,x_0));

Nur das Problem ist das "x" nicht als ein Parameter angesehen wird, sondern als eine Zahl.
Wie kann ich "Tangente" so modifizieren, dass x keine Zahl mehr ist, sondern ein Art Platzhalter?
Edit: Scanner wurde als y deklariert.
 
Edit : Warum muss ich sie denn aufrufen?
Weil in Objekte Nachrichten austauschen. Das geschieht durch Methodenaufrufe.

Du willst vermutlich Kompositionen von Funktionen haben. Wenn Du eine Funktion f:IN -> IN hast und eine Funktion g:IN -> IN, dann kannst Du eine Funktion h:IN -> IN mit h := f ° g (wobei ° die Komposition darstellt) haben. Das wäre im Bereich der funktionalen Programmierung anzusiedeln, die seit Java 8 ansatzweise unterstützt wird, und zwar mit Methodenreferenzen bzw. funktionalen Interfaces.
 
x kennzeichnet an der Stelle Dein Scanner-Objekt.

Habe ich jetzt als y umdeklariert. Trotzdem bekomme ich nur Zahlen raus.
Das "x" soll nur ein Platzhalter sein. Wie könnte ich dies bewerkstelligen?

Java:
public static int TangenteR(int AbleitungS, int Funktionswert,String x,int x_0)   

{
    
int Tangente = AbleitungS*x-AbleitungS*x_0+Funktionswert;   
    
    
return Tangente;   
}
 
Also die Funktion kann ja nicht mit Platzhaltern rechnen, sondern es geht darum, einen konkreten Wert zu berechnen. Also muss die Funktion konkrete Werte bekommen. Mit diesen konkreten Werten kann die Funktion dann rechnen.

Und wenn Du mathematisch etwas berechnen willst, dann ist der Typ String wohl eher nicht geeignet.

Also musst Du dir überlegen, an welcher Stelle Du denn nun den Wert berechnet haben willst und das übergeben (so ich jetzt richtig verstanden habe, was Du da machen willst ...).

Und wieso nennst Du eine Scanner instanz x oder y? Nenne Variablen doch bitte so, dass klar ist, was da drin gespeichert ist. Oft wird bei sowas einfach der Klassenname in camel case genommen (also Scanner scanner = new Scanner(System.in)😉 oder so Du mehr mit Scannern machst als nur User Input zu lesen, dann kommt halt ein userInputScanner oder so in Frage. Das nur als kleine Anregung.
 
Danke für den Tipp. Scanner x begleitet mich schon seit ich mit Java angefangen habe.
Die Sache mit der Tangente ist ja, dass ich keine Werte haben möchte sondern, es soll folgendes rauskommen.
t(x) = f'(x_0)*x-f'(x_0)*x_0+f(x_0) = f'(x_0)*(x-x_0)+f(x_0)
Ich wollte eigentlich die Vereinfachung nehmen, die wollte aber nicht funktionieren.
 
Java:
System.out.println("t(x) = f'(x_0)*x-f'(x_0)*x_0+f(x_0) = f'(x_0)*(x-x_0)+f(x_0)");

Wird dann nicht nur das ausgegeben was in der Klammer steht? Ich möchte, aber das die Tangente rauskommt.

Als Beispiel:
f(x) = x² , x_0 = 2
f'(x) = 2x
f(2) = 4
f'(2) = 4
t(x) = 4*x-8+4 = 4*x-4<---- Das möchte ich haben.

Sollte ich es schaffen, dieses Programm zu laufen zu bringen, dann soll noch eine Überprüfung reinkommen ob folgendes gilt:
f(x_0) = t(x_0)
f'(x_0) = t'(x_0)
 
Ich hoffe, dass ich Dich jetzt richtig verstanden habe:
Java:
public class Test {
    static String sign(int x) {
        return x < 0 ? " - " : " + ";
    }

    // fx = Funktionswert an Stelle x0
    // dfx = Wert der Ableitung an Stelle x0
    static String t(int x0, int fx, int dfx) {
        int right = -dfx*x0 + fx;

        return "t(x) = " + dfx + " * x" + sign(-dfx*x0) + Math.abs(dfx*x0) 
            + sign(fx) + Math.abs(fx) + " = " + dfx + " * x" + sign(right) + Math.abs(right);
    }

    public static void main(String[] args) {
        System.out.println(t(2, 4, 4));
    }
}
 
Ich habe einfach Deine Formel t(x) genommen und an den entsprechenden Stellen die Werte berechnet.

Muss man so einen großen Umweg machen,nur um "x" als Platzhalter zu bekommen?
Das kommt darauf an. Wenn Du eine Formel (= Zeichenkette) ausgeben willst, dann besteht der String aus verschiedenen Teilen und die musst Du halt entsprechend formatieren. Es ginge wahrscheinlich auch schöner, aber da habe ich gerade keinen Nerv dazu 🙂

Etwas anderes ist es, wenn Du einfach nur den berechneten Wert haben willst.
 
Ich habe einfach Deine Formel t(x) genommen und an den entsprechenden Stellen die Werte berechnet.


Das kommt darauf an. Wenn Du eine Formel (= Zeichenkette) ausgeben willst, dann besteht der String aus verschiedenen Teilen und die musst Du halt entsprechend formatieren. Es ginge wahrscheinlich auch schöner, aber da habe ich gerade keinen Nerv dazu 🙂

Etwas anderes ist es, wenn Du einfach nur den berechneten Wert haben willst.

Ich will nur das am Ende, sowas steht wie z.b 4x-4. Kann man das bewerkstelligen, ohne alles umschreiben zu müssen?
 
So?
Java:
import java.util.Scanner; // t(x) = f'(x_0)*(x-x_0)+f(x_0) = f'(x_0)*x-f'(x_0)*x_0+f(x_0)

public class Tangente {
    public static void main(String[]args) {
        Scanner x = new Scanner(System.in);
        System.out.println("Bitte geben Sie die Stelle ein.");
        int x_0 = x.nextInt();
        System.out.println("Geben Sie die Koeffizienten ein.");   
        int a = x.nextInt();
        int b = x.nextInt();
        int c = x.nextInt();
        System.out.println("Die Tangente an der Stelle "+x_0+" lautet: "+
                TangenteR(AbleitungS(x_0, a, b), Funktionswert(a, b, c, x_0), x_0));
    }
    
    public static int AbleitungX(int a) {
        int Ableitung = a*2;
        return Ableitung; 
    }
    
    public static int AbleitungX2(int b) {
        int Ableitung2 = b;
        return Ableitung2;
    }
    
    public static int AbleitungS(int x_0,int a, int b) {  
        int AbleitungS = AbleitungX(a)*x_0+AbleitungX2(b);       
        return AbleitungS;    
    }
    
    public static int Funktionswert(int a,int b,int c, int x_0) {    
        int Funktionswert = a*x_0*x_0+b*x_0+c;       
        return Funktionswert;   
    }
    
    public static String TangenteR(int AbleitungS, int Funktionswert, int x_0) {
        int rest = -AbleitungS*x_0+Funktionswert;
        String operator = rest < 0 ? "-" : "+";
        return AbleitungS +"*x"+operator+Math.abs(rest);
    }
}
 
So?
Java:
import java.util.Scanner; // t(x) = f'(x_0)*(x-x_0)+f(x_0) = f'(x_0)*x-f'(x_0)*x_0+f(x_0)

public class Tangente {
    public static void main(String[]args) {
        Scanner x = new Scanner(System.in);
        System.out.println("Bitte geben Sie die Stelle ein.");
        int x_0 = x.nextInt();
        System.out.println("Geben Sie die Koeffizienten ein.");  
        int a = x.nextInt();
        int b = x.nextInt();
        int c = x.nextInt();
        System.out.println("Die Tangente an der Stelle "+x_0+" lautet: "+
                TangenteR(AbleitungS(x_0, a, b), Funktionswert(a, b, c, x_0), x_0));
    }
   
    public static int AbleitungX(int a) {
        int Ableitung = a*2;
        return Ableitung;
    }
   
    public static int AbleitungX2(int b) {
        int Ableitung2 = b;
        return Ableitung2;
    }
   
    public static int AbleitungS(int x_0,int a, int b) { 
        int AbleitungS = AbleitungX(a)*x_0+AbleitungX2(b);      
        return AbleitungS;   
    }
   
    public static int Funktionswert(int a,int b,int c, int x_0) {   
        int Funktionswert = a*x_0*x_0+b*x_0+c;      
        return Funktionswert;  
    }
   
    public static String TangenteR(int AbleitungS, int Funktionswert, int x_0) {
        int rest = -AbleitungS*x_0+Funktionswert;
        String operator = rest < 0 ? "-" : "+";
        return AbleitungS +"*x"+operator+Math.abs(rest);
    }
}

Ja genau. Ich kann aber die Modifizierung nicht verstehen. Was hast du verändert?
 
In erster Linie TangenteR, die jetzt eine Zeichenkette zurückgibt. Das "x" im Parameter braucht es nicht, da es ja nicht als Wert übergeben wird sondern tatsächlich nur als "x" in der Zeichenkette auftritt.

Dann natürlich den Aufruf von TangenteR in main angepasst. Und noch einen kleinen Fehler in Funktionswert behoben (es soll ja x_0*x_0 und nicht x_0+x_0 berechnet werden).

That's it.
 
In erster Linie TangenteR, die jetzt eine Zeichenkette zurückgibt. Das "x" im Parameter braucht es nicht, da es ja nicht als Wert übergeben wird sondern tatsächlich nur als "x" in der Zeichenkette auftritt.

Dann natürlich den Aufruf von TangenteR in main angepasst. Und noch einen kleinen Fehler in Funktionswert behoben (es soll ja x_0*x_0 und nicht x_0+x_0 berechnet werden).

That's it.

Danke, diesen Fehler hatte ich überhaupt nicht bemerkt. Genau, die letzte Methode. Was genau müsste ich bei mir ändern?
 
Die Methode baut eine Zeichenkette zusammen anstatt den Wert vollständig auszurechnen. Das ist alles.

Du hast ja gerechnet:
Java:
int Tangente = AbleitungS*x-AbleitungS*x_0+Funktionswert;
Und wolltest aber alles außer das "x" ausgerechnet haben und dann eine Zeichenkette, die das x an den entsprechenden Stelle entält, zurückhaben.

Der Code
Java:
return AbleitungS + " * x"
Würde eine Zeichenkette liefern, die mit dem Inhalt der Variablen AbleitungS (eine Zahl beginnt) und dann " * x" (ohne Anführungszeichen) anfügt.

Beim Anfügen des rechten Teils muss man aber aufpassen, denn Du willst ja nicht das Vorzeichen ausgeben, sondern die Rechenoperation. Daher der "operator". Du kannst ja selbst mal ein wenig mit den Zeichenketten rumprobieren.
 
Die Methode baut eine Zeichenkette zusammen anstatt den Wert vollständig auszurechnen. Das ist alles.

Du hast ja gerechnet:
Java:
int Tangente = AbleitungS*x-AbleitungS*x_0+Funktionswert;
Und wolltest aber alles außer das "x" ausgerechnet haben und dann eine Zeichenkette, die das x an den entsprechenden Stelle entält, zurückhaben.

Der Code
Java:
return AbleitungS + " * x"
Würde eine Zeichenkette liefern, die mit dem Inhalt der Variablen AbleitungS (eine Zahl beginnt) und dann " * x" (ohne Anführungszeichen) anfügt.

Beim Anfügen des rechten Teils muss man aber aufpassen, denn Du willst ja nicht das Vorzeichen ausgeben, sondern die Rechenoperation. Daher der "operator". Du kannst ja selbst mal ein wenig mit den Zeichenketten rumprobieren.

Ich werde ein bisschen experimentieren. Vielen Dank für die Hilfe.
 

Neue Themen


Zurück
Oben