Kurvendiskussion durchführen

fabsen

Mitglied
Hallo Leute,
ich habe vor ein Programm zu schreiben das eine Kurvendiskussion durchführt.
ich habe es wahrscheinlich etwas umständlich programmiert aber für mich so verständlicher.
Ich habe folgendes Problem:
wenn in der funktion alle Werte positiv sind dann wird in der Konsole nur die Funktion ausgegeben.
und wenn ich beispielsweise -x^3+x^2-x-1 eingebe dann gibt er mir ne komische polynomzahl wieder.
hier ist mein Quellcode:(übrigens benutze ich das Programm BlueJ)
Java:
public class Funktion3GradesVol3
{
    private double xHochDrei;
    private double xHochZwei;
    private double xHochEins;
    private double xHochNull;
    private double ergebnis, ergebnis1, ergebnis2, ergebnis3, ergebnis4, ergebnis5, ergebnis6, ergebnis7, ergebnis8, ergebnis9, ergebnis10, ergebnis11, ergebnis12,
                    ergebnis13;
    private int verlauf1, verlauf2;
    private boolean sattelpunkt1, sattelpunkt2;

    public Funktion3GradesVol3(double xHochDrei, double xHochZwei, double xHochEins, double xHochNull)
    {
        this.xHochDrei=xHochDrei;
        this.xHochZwei=xHochZwei;
        this.xHochEins=xHochEins;
        this.xHochNull=xHochNull;
        ergebnis=0;
    }

    public double polynomZahl1()//ermittelt die Zahl dir zur Polynomdivision notwendig ist
    {
        double ergebnisX1=0;
        double ergebnisX2=0;
        double ergebnisX3=0;
        double ergebnisX4=0;
        double ergebnisX5=0;
        double ergebnisX6=0;

        if(xHochDrei>0 && xHochZwei>0 && xHochEins>0 && xHochNull>0)
        {
            for(double a=0; a>=-1000;a-=0.001)
            {
                ergebnisX4=xHochDrei*a*a*a;
                ergebnisX5=xHochZwei*a*a;
                ergebnisX6=xHochEins*a;
                ergebnis=ergebnisX4+ergebnisX5+ergebnisX6+xHochNull;
                ergebnis = Math.ceil(ergebnis*10)/10.0;
                if(ergebnis==0.0)
                {
                    a = Math.round(a*100)/100.0; 
                    ergebnis=a;
                    return a;
                }        
            }
        }
        else
        {
            if(xHochDrei<0 && xHochZwei<0 && xHochEins<0 && xHochNull<0)
            {
                for(double a=0; a>=-1000;a-=0.001)
                {
                    ergebnisX4=xHochDrei*a*a*a;
                    ergebnisX5=xHochZwei*a*a;
                    ergebnisX6=xHochEins*a;
                    ergebnis=ergebnisX4+ergebnisX5+ergebnisX6+xHochNull;
                    ergebnis = Math.ceil(ergebnis*10)/10.0;
                    if(ergebnis==0.0)
                    {
                        a = Math.round(a*100)/100.0; 
                        ergebnis=a;
                        return a;
                    }        
                }
            }
            else
            {
                if(xHochDrei!=0)
                {
                    for(double a=0; a<=1000;a+=0.001)
                    {
                        ergebnisX1=xHochDrei*a*a*a;
                        ergebnisX2=xHochZwei*a*a;
                        ergebnisX3=xHochEins*a;
                        ergebnis=ergebnisX1+ergebnisX2+ergebnisX3+xHochNull;
                        ergebnis = Math.floor(ergebnis*10)/10.0;
                        if(ergebnis==0.0)
                        {
                            a = Math.round(a*100)/100.0;
                            ergebnis=a;
                            return a;
                        }        
                    }
                }
                else
                {
                    for(double a=0; a>=-1000;a-=0.001)
                    {
                        ergebnisX4=xHochDrei*a*a*a;
                        ergebnisX5=xHochZwei*a*a;
                        ergebnisX6=xHochEins*a;
                        ergebnis=ergebnisX4+ergebnisX5+ergebnisX6+xHochNull;
                        ergebnis = Math.ceil(ergebnis*10)/10.0;
                        if(ergebnis==0.0)
                        {
                            a = Math.round(a*100)/100.0;                    
                            ergebnis=a;
                            return a;
                        }      
                    }
                }
            }
        }
        return ergebnis;
    }

    private void nullstellen()
    {
        //Polynomdivision
        double xHochZwei2 = xHochZwei;
        double xHochEins2 = xHochEins;
        double xHochNull2 = xHochNull;
        xHochZwei2 = xHochDrei;
        xHochEins2 = xHochZwei-(-(xHochZwei2*polynomZahl1()));
        xHochNull2 = xHochEins-(-(xHochEins2*polynomZahl1()));

        //pq-Formel
        double p1, p2, q, wurzel;
        xHochEins2 = xHochEins2/xHochZwei2;
        xHochNull2 = xHochNull2/xHochZwei2;

        p1=-xHochEins2/2;
        p2=p1*p1;
        q=xHochNull2;
        wurzel=Math.sqrt(p2-q);
        ergebnis1=p1+wurzel;
        ergebnis1= Math.round(ergebnis1*100)/100.0;
        ergebnis2=p1-wurzel;
        ergebnis2=Math.round(ergebnis2*100)/100.0;
    }

    private void hochpunktTiefpunkt()
    {
        //Ableitung
        double xHochZwei2 = xHochZwei;
        double xHochEins2 = xHochEins;
        double xHochNull2 = xHochNull;
        xHochZwei2=xHochDrei*3;
        xHochEins2=xHochZwei*2;
        xHochNull2=xHochEins;
        //pq-Formel
        double p1, p2, q, wurzel;
        xHochEins2 = xHochEins2/xHochZwei2;
        xHochNull2 = xHochNull2/xHochZwei2;
        p1=-xHochEins2/2;
        p2=p1*p1;
        q=xHochNull2;
        wurzel=Math.sqrt(p2-q);
        ergebnis3=p1+wurzel;
        ergebnis3=Math.round(ergebnis3*100)/100.0;
        ergebnis4=p1-wurzel;
        ergebnis4=Math.round(ergebnis4*100)/100.0;
        //Überprüfung Hoch oder Tiefpunkt
        xHochEins2=xHochZwei2*2;
        xHochNull2=xHochEins2;
        ergebnis5=xHochEins2*ergebnis3+xHochNull2;
        ergebnis6=xHochEins2*ergebnis4+xHochNull2;
        if(ergebnis5==0)
        {
            //1. Ableitung 
            double xHochZwei3 = xHochZwei;
            double xHochEins3 = xHochEins;
            double xHochNull3 = xHochNull;
            xHochZwei3=xHochDrei*3;
            xHochEins3=xHochZwei*2;
            xHochNull3=xHochEins;
            //2.Ableitung
            double merker=xHochEins3;
            xHochEins3=xHochZwei3*2;
            xHochNull3=merker;
            //3.Ableitung
            xHochNull3=xHochEins3;
            if(xHochNull3!=0)
                sattelpunkt1=true;
        }
        if(ergebnis6==0)
        {
            //1. Ableitung 
            double xHochZwei3 = xHochZwei;
            double xHochEins3 = xHochEins;
            double xHochNull3 = xHochNull;
            xHochZwei3=xHochDrei*3;
            xHochEins3=xHochZwei*2;
            xHochNull3=xHochEins;
            //2.Ableitung
            double merker=xHochEins3;
            xHochEins3=xHochZwei3*2;
            xHochNull3=merker;
            //3.Ableitung
            xHochNull3=xHochEins3;
            if(xHochNull3!=0)
                sattelpunkt2=true;
        }
        //yWert ausrechnen
        ergebnis7=xHochDrei*ergebnis3*ergebnis3*ergebnis3+xHochZwei*ergebnis3*ergebnis3+xHochEins*ergebnis3+xHochNull;
        ergebnis8=xHochDrei*ergebnis4*ergebnis4*ergebnis4+xHochZwei*ergebnis4*ergebnis4+xHochEins*ergebnis4+xHochNull;
    }

    private void wendepunkt()
    {
        //Ableitung 1
        double xHochZwei2 = xHochZwei;
        double xHochEins2 = xHochEins;
        double xHochNull2 = xHochNull;
        xHochZwei2=xHochDrei*3;
        xHochEins2=xHochZwei*2;
        xHochNull2=xHochEins;
        //Ableitung 2
        xHochEins2=xHochZwei2*2;
        xHochNull2=xHochEins2;
        //Wendestelle
        xHochNull2=-xHochNull2;
        ergebnis9=xHochNull2/xHochEins2;
        ergebnis9=Math.round(ergebnis9*100)/100.0;
        //Wendepunkt
        ergebnis10=xHochDrei*ergebnis9*ergebnis9*ergebnis9+xHochZwei*ergebnis9*ergebnis9+xHochEins*ergebnis9+xHochNull;
        ergebnis10=Math.round(ergebnis10*100)/100.0;
    }

    private void graphenverlauf()
    {
        ergebnis11=xHochDrei*-1*-1*-1+xHochZwei*-1*-1+xHochEins*-1+xHochNull;
        ergebnis12=xHochDrei+xHochZwei+xHochEins+xHochNull;
        if(ergebnis11<0)
        {
            verlauf1=-1;
        }
        else
        {
            verlauf1=1;
        }
        if(ergebnis12<0)
        {
            verlauf2=2;
        }
        else
        {
            verlauf2=1;
        }
    }

    public void kurvendiskussionDurchfuehren()
    {
        nullstellen();
        hochpunktTiefpunkt();
        wendepunkt();
        graphenverlauf();
    }

    public void ausgeben()
    {
        //Ausgangsfunktion
        if(xHochZwei>=0 && xHochEins>=0 && xHochNull>=0)
        {
            System.out.println("Funktion: "+xHochDrei+"x³ +"+xHochZwei+"x² +"+xHochEins+"x +"+xHochNull);
        }
        else
        {
            if(xHochZwei<=0 && xHochEins>=0 && xHochNull>=0)
            {
                System.out.println("Funktion: "+xHochDrei+"x³ "+xHochZwei+"x² +"+xHochEins+"x +"+xHochNull);
            }
            else
            {
                if(xHochZwei>=0 && xHochEins<=0 && xHochNull>=0)
                {
                    System.out.println("Funktion: "+xHochDrei+"x³ +"+xHochZwei+"x² "+xHochEins+"x +"+xHochNull);
                }
                else
                {
                    if(xHochZwei>=0 && xHochEins>=0 && xHochNull<=0)
                    {
                        System.out.println("Funktion: "+xHochDrei+"x³ +"+xHochZwei+"x² +"+xHochEins+"x "+xHochNull);
                    }
                    else
                    {
                        if(xHochZwei<=0 && xHochEins<=0 && xHochNull>=0)
                        {
                            System.out.println("Funktion: "+xHochDrei+"x³ "+xHochZwei+"x² "+xHochEins+"x +"+xHochNull);
                        }
                        else
                        {
                            if(xHochZwei<=0 && xHochEins<=0 && xHochNull<=0)
                            {
                                System.out.println("Funktion: "+xHochDrei+"x³ "+xHochZwei+"x² "+xHochEins+"x "+xHochNull);
                            }
                            else
                            {
                                if(xHochZwei<=0 && xHochEins>=0 && xHochNull<=0)
                                {
                                    System.out.println("Funktion: "+xHochDrei+"x³ "+xHochZwei+"x² +"+xHochEins+"x "+xHochNull);
                                }
                                else
                                {
                                    if(xHochZwei>=0 && xHochEins<=0 && xHochNull<=0)
                                    {
                                        System.out.println("Funktion: "+xHochDrei+"x³ +"+xHochZwei+"x² "+xHochEins+"x "+xHochNull);
                                    }
                                }
                            }
                        }
                    }
                }
            }
            //Ausgangsfunktion

            //Nullstellen
            System.out.println("Nullstellen: "+polynomZahl1()+", "+ergebnis1+", "+ergebnis2);
            //Nullstellen

            //Hochpunkt und Tiefpunkt
            if(ergebnis5<0 && sattelpunkt1==false)
            {
                System.out.println("Hochpunkt: ("+ergebnis3+"/"+ergebnis7+")");
            }
            else
            {
                if(ergebnis5>0 && sattelpunkt1==false)
                {
                    System.out.println("Tiefpunkt: ("+ergebnis3+"/"+ergebnis7+")");
                }
                else
                {
                    if(sattelpunkt1==true)
                    {
                        System.out.println("Dieser Punkt ist ein Sattelpunkt");
                    }
                    else
                    {
                        System.out.println("Es gibt kein Hochpunkt/Tiefpunkt");
                    }
                }
            }
            if(ergebnis6<0 && sattelpunkt2==false)
            {
                System.out.println("Hochpunkt: ("+ergebnis4+"/"+ergebnis8+")");
            }
            else
            {
                if(ergebnis6>0 && sattelpunkt2==false)
                {
                    System.out.println("Tiefpunkt: ("+ergebnis4+"/"+ergebnis8+")");
                }
                else
                {
                    if(sattelpunkt2==true)
                    {
                        System.out.println("Dieser Punkt ist ein Sattelpunkt");
                    }
                }
            }
            //Hochpunkt und Tiefpunkt Oder Sattelpunkt

            //Wendepunkt
            System.out.println("Wendepunkt: ("+ergebnis9+"/"+ergebnis10+")");
            //Wendepunkt

            //Graphenverlauf
            if(verlauf1<0 && verlauf2<0)
            {
                System.out.println("Der Graph kommt aus dem 3. Quadranten und geht in den 4. Quadranten");
            }
            else
            {
                if(verlauf1<0 && verlauf2>0)
                {
                    System.out.println("Der Graph kommt aus dem 3. Quadranten und geht in den 1. Quadranten");
                }
                else
                {
                    if(verlauf1>0 && verlauf2<0)
                    {
                        System.out.println("Der Graph kommt aus dem 2. Quadranten und geht in den 4. Quadranten");
                    }
                    else
                    {
                        if(verlauf1>0 && verlauf2>0)
                        {
                            System.out.println("Der Graph kommt aus dem 2. Quadranten und geht in den 1. Quadranten");
                        }
                    }
                }
            }
            //Graphenverlauf

            //Symmetrie
            if(xHochDrei==0 && xHochEins==0)
            {
                System.out.println("Der Graph ist achsensymetrisch");
            }
            else
            {
                if(xHochZwei==0 && xHochNull==0)
                {
                    System.out.println("Der Graph ist punktsymetrisch");
                }
                else
                {
                    System.out.println("Es ist keine Symmetrie erkennbar");
                }
            }
            //Symmetrie

            //Schnittpunkt y-Achse
            System.out.println("Der Schnittpunkt mit der Y-Achse liegt bei "+xHochNull);
            //Schnittpunkt y-Achse
        }
    }
}
 
M

Marcinek

Gast
Ich glaube kaum, dass dir hier jemand helfen kann.

Der Code ziemlich lang und die Variablen ergebnis1...100.

Grenze es ein au die Stelle, die den Fehler erzeugt und poste diese hier.
 

fabsen

Mitglied
Der Fehler liegt in der methode polynomZahl1()
wenn ich in BlueJ ein objekt erzeuge und bei der ersten variable -1 der zweiten 1 und der dritten und vierten -1 eingebe gibt die methode eine falsche zahl zurück!!
es müsste als ergebnis gerundet -0.54 rauskommen
er gibt mir aber -9.99001001E8 zurück.
 

Marco13

Top Contributor
Sowas wie
for(double a=0; a>=-1000;a-=0.001)
sieht auch SEHR gewagt aus... Versuch' mal, durch ein Paar
System.out.println("Mache jetzt dies und das...");
System.out.println("dies-und-das ist "+diesUndDas);
den Fehler einzugrenzen (also wo zum ersten mal ein unerwartetes Ergebnis auftaucht)
 

fabsen

Mitglied
Danke für die Hilfe :)
ich habe beide Probleme jetzt rausgefunden... die System.out.println's haben nicht wirklich weiter geholfen... aber bei dem reinschreiben der System.out.println's habe ich rausgefunden das ich ein Fehler bei ner If-Verzweigung hatte...
Vielen Dank schon mal bis jetzt hoffe ich das alle Probleme beseitigt habe aber ich denke es wird bald ein nächstes Folgen :D
 

fabsen

Mitglied
Ich hab mal ne Frage...
ich will dafür noch nen Applet machen... hab aber en problem...
und zwar ich will noch ne Funktion 4. Grades anzeigen lassen...
wir krieg ich das hin das in dem Applet das zu sehen ist?
ich mach es mit g.drawString() und hab die hoch 4 aus der Zeichentabelle aber wenn ich das Applet ausführe zeigt er mir nen Fragezeichen an....
kann mir jemand helfen?
 

Landei

Top Contributor
Viele Swing-Komponenten unterstützen HTML. Wenn ich in einem Label z.B. "<html>x<sup>4</sup></html>" angebe, sollte es x mit einer hochgestellten 4 zeigen.
 

Marco13

Top Contributor
Das geht dann halt nicht mehr direkt mit g.drawString. Für so ein einzelnes, gochgestelltes Zeichen könnte man sich zwar noch irgendwelche würgarounds auf Basis von drawString überlegen, aber die Empfehlung wäre schon, die Formel, wie Landei beschrieben hat, von einem JLabel anzeigen zu lassen. (Und selbst wenn die Formel "irgendwo innerhalb eines JPanels" hingeschrieben werden soll, könnte es einfacher (ein bißchen frickelig, aber einfacher) sein, sie von einem JLabel dort hinzeichnen zu lassen...)
 

Marco13

Top Contributor
Grundsätzlich kann man wohl ein JLabel erstellen (mit dem HTML-Text drauf) und dann innerhalb der paintComponent-Methode des JPanels sowas machen wie
label.paintComponent(graphics);

Das Label wird aber nirgends hinzugefügt, sondern nur als "Zeichner" verwendet. Die Größe etc. muss man da selbst anpassen. Wenn's nicht klappt, sag nochmal bescheid (ich selbst hab' das AFAIR noch nicht direkt so verwendet, aber es sollte irgendwie machbar sein).
 

fabsen

Mitglied
@Marco13:
könntest du mir mal eine genauere Erklärung von deiner Idee geben
ich weiß nicht so ganz wie ich das umsetzen soll.... D A N K E
 

Marco13

Top Contributor
Ja, man kann sich da so eine kleiner Hilfsklasse dafür schreiben. Es gibt vielleicht noch eine einfachere/elegantere Möglichkeit, aber ... (jetzt weiß ich nicht, wie ich den Satz beenden soll)
Java:
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

class HTMLPainter
{
	private static JLabel label;
	
	static
	{
		label = new JLabel();
		label.setOpaque(false);
	}
	
	public static void drawHTML(String htmlString, int x, int y, Graphics gr)
	{
		label.setText(htmlString);
		label.setForeground(gr.getColor());
		label.setFont(gr.getFont());
		label.setSize(label.getPreferredSize());
		Graphics g = gr.create();
		g.translate(x, y);
		label.paint(g);
		g.dispose();
	}
}

public class TestPaintHTML
{
    public static void main(String args[])
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                JFrame f = new JFrame();
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                
                f.getContentPane().add(createPanel());
                
                f.setSize(400,300);
                f.setVisible(true);
            }
        });
    }
    
    
    private static JPanel createPanel()
    {
        return new JPanel()
        {
            @Override
            protected void paintComponent(Graphics g)
            {
                super.paintComponent(g);
                
                Font font0 = new Font("Monospaced", Font.PLAIN, 16);
                g.setFont(font0);
                g.setColor(Color.RED);
                HTMLPainter.drawHTML(
                	"<html>This <b><u>is just</u> a </b> Test", 10, 20, g);

                Font font1 = new Font("Serif", Font.PLAIN, 15);
                g.setFont(font1);
                g.setColor(Color.BLUE);
                HTMLPainter.drawHTML(
                	"<html>This <b><u><sub>is</sub> just</u> " +
                	"a <sup>small</sup></b> Test", 40, 50, g);
            }
        };
        
    }
    
}
 

Marco13

Top Contributor
Manchmal bin ich naiv genug, zu glauben, dass jemand eine Websuche macht, bevor er hier eine Frage stellt, und ich das deswegen nicht mehr machen muss ;) Aber wenn der String etwas komplizierter ist (wie in dem Beispiel) ist HTML schon übersichtlicher...
 
Zuletzt bearbeitet:

muckelzwerg

Bekanntes Mitglied
Ja, das kann gut sein. Ich schätze aber mal das man die AttributetStrings weitgehend wie normale Strings aneinander anhängen kann.
Dann könnte man eine Funktion "sup(String s)" verwenden und den Text wieder mit "+" zusammensetzen.
Hab ich jedoch noch nicht versucht.
 

Samuel72

Aktives Mitglied
Hallo zusammen,

ich habe mal was mit Unicode probiert.
Müsste für JLabels usw. funktionieren;
für Konsolenausgaben nicht.

Java:
private static String[] superscript = new String[] {"\u00BA","\u00B9","\u00B2","\u00B3","\u2074","\u2075","\u2076","\u2077","\u2078","\u2079"}; 

public static String exponent(int i) {
  if(i==0) return superscript[0];
  String res = "";
  while(i>0) {
    res = superscript[i-i/10*10] + res;
    i/=10;			
  }
  return res;
}
 

fabsen

Mitglied
Danke für die hilfe klappt soweit alles...
ich habe ads mit JPanel auch hinbekommen...
da habe ich jetzt eine frage...
wie kann ich eine jTextField sagen das nur zahlen reingeschrieben werden können nicht nur + zahlen auch -zahlen...
habe schon was gefunden gehabt aber das geht nur mit + zahlen...
außerdem will ich das die max Eingabe in dem Feld auf 3 is wie kann ich das umsetzen...
komm nicht wirklich weiter...
 
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben