Funktionsplotter - Programmierung

S

Simii123

Neues Mitglied
0
Hallo liebe Community,

für eine Studienarbeit versuche ich momentan, einen Funktionsplotter zu programmieren. Leider habe ich keine Idee, wie ich weiterkomme :(
Ich habe den String "funktion", in dem die eingegebenen Zeichen für die Funktion, die geplottet werden soll, enthalten sind, also ist funktion beispielsweise = 2*x^2 o.ä. Nun muss ich ja den String irgendwie "Zerlegen" und dann mathematisch auwerten, um dann die Werte für verschiedene x berechnen zu können.
Kann mir vielleicht einer sagen, wie ich das am besten lösen kann?
Bin wirklich schon am verzweifeln!

Vielen Dank im Voraus!
 
Zuletzt bearbeitet:
Musst/willst du die Verarbeitung der Formel selber entwickeln? Allzu einfach ist das glaube ich nicht, aber sicher eine gute Herausforderung ;) Ich habs selber noch nie gemacht, aber vielleicht helfen dir ein paar Anregungen.

Das parsen ("zerlegen") der Formel könnte evtl. einfacher sein, wenn du sie zuerst in die Umgekehrte Polnische Notation konvertierst. Dafür könntest du den Shaunting-Yard Algorithmus verwenden. Zum Berechnen kannst du dann z.B. hier Beispiele anschauen. Ich weiss nicht, ob dabei alle deine benötigten Operationen unterstützt werden, aber der Code sieht immerhin nicht allzu lang und kompliziert aus.

Falls du auch Libraries verwenden darfst, die dir die Arbeit abnehmen:
https://github.com/darius/expr
https://code.google.com/p/expressionoasis/
exp4j - Download exp4j
 
Vielen Dank für die Antwort! Die Verarbeitung muss ich nicht unbedingt selbst entwickeln, ich kann auch vorhandene Ansätze benutzen. Werde mir die links auf jeden Fall anschauen! Hoffentlich hilft das :)
Bibliotheken darf ich auch verwenden

Der ursprüngliche Beitrag von 14:37 Uhr wurde um 15:56 Uhr ergänzt:

Also der shunting-yard-Algorithmus bzw. die umgekehrte polnische Notation sind wohl genau das, was ich brauche! Habe ich das richtig verstanden, dass ich, wenn ich das richtig in meinen Code reinbekomme, jedes Zeichen in diese Notation überführt wird und das Ergebnis berechnet wird? Das wäre natürlich mein Idealfall.
Verstehe nur nicht wirklich, wie ich das jetzt in meinen Code reinbekommen kann :| Code einfach rüberkopieren funktioniert (natürlich) nicht..
Habe es jetzt mal so "abgeändert", muss aber auch zugeben, dass ich die Sache mit den einzelnen stacks auch nach jetzt mehrmaligen Durchlesen echt nicht wirklich verstehe :/ Deswegen weiß ich jetzt auch nicht, wie ich den Code anpassen muss, damit es dann wirklich passt...

Code:
public void Berechnung(String expr){
	String cleanExpr = cleanExpr(expr);
		LinkedList<Double> stack = new LinkedList<Double>();
		for(String token:cleanExpr.split("\\s")){
			Double tokenNum = null;
			try{
				tokenNum = Double.parseDouble(token);
			}catch(NumberFormatException e){}
			if(tokenNum != null){
				stack.push(Double.parseDouble(token+""));
				}else if(token.equals("*")){
				double secondOperand = stack.pop();
				double firstOperand = stack.pop();
				stack.push(firstOperand * secondOperand);
			}else if(token.equals("/")){
				double secondOperand = stack.pop();
				double firstOperand = stack.pop();
				stack.push(firstOperand / secondOperand);
			}else if(token.equals("-")){
				double secondOperand = stack.pop();
				double firstOperand = stack.pop();
				stack.push(firstOperand - secondOperand);
			}else if(token.equals("+")){
				double secondOperand = stack.pop();
				double firstOperand = stack.pop();
				stack.push(firstOperand + secondOperand);
			}else if(token.equals("^")){
				double secondOperand = stack.pop();
				double firstOperand = stack.pop();
				stack.push(Math.pow(firstOperand, secondOperand));
			}
		}
		y1.setText("Y1:"+stack.pop());
	}
 
Der Beispielcode ist nur dafür da, die umgekehrte polnische Notation zu parsen und zu berechnen. Die Umrechnung von Infix-Notation zu UPN (also das, was der Shunting-Yard Algorithmus macht) ist nicht dabei, das müsstest du vorher noch machen.

Es gibt sicher irgendwo Beispiele vom Algorithmus in Java, danach habe ich bisher nicht gesucht, war ja nur mal als Anregung gedacht :thumbup:

Es würde aus meinem Verständnis etwa so ablaufen:
  1. Shunting-Yard Algoritmus konvertiert Formel zu UPN
  2. Im UPN-String ersetzt du x durch einen Wert
  3. Der gepostete Beispielcode berechnet anhand der UPN das Ergebnis
  4. Wiederhole Schritt 2 mit einem anderen Wert für x
 
Zuletzt bearbeitet:
So, nach langer Zeit nun wieder eine Antwort von mir..
Ich habe einen Shunting Yard gefunden, jedoch funktioniert dieser leider nicht bei mir :/ kann mir vielleicht jemand weiterhelfen, wo eventuell mein Fehler liegt?

Code:
import java.util.*;  
public class ShuntingYard {   
  
private enum Operator   {         
ADD(1), SUBTRACT(2), MULTIPLY(3), DIVIDE(4);         
final int precedence;         
Operator(int p) { precedence = p; }     
}      
private Map<String, Operator> ops = new HashMap<String, Operator>() {{         
put("+", Operator.ADD);         
put("-", Operator.SUBTRACT);         
put("*", Operator.MULTIPLY);         
put("/", Operator.DIVIDE);     }}; 
    
 private boolean isHigerPrec(String op, String sub)     {         
return (ops.containsKey(sub) && ops.get(sub).precedence >= ops.get(op).precedence);     }      

public TextView RPN(View view)     {

String Function = getIntent().getStringExtra("funktion");
StringBuilder output = new StringBuilder();         
Deque<String> stack  = new LinkedList<>();          

for (String token : Function.split("\\s")) {            
 // operator            
if (ops.containsKey(token)) {                 
while ( ! stack.isEmpty() && isHigerPrec(token, stack.peek()))                    
output.append(stack.pop()).append(' ');                 
stack.push(token);             
 // left parenthesis             
}else if (token.equals("(")) {                 
stack.push(token);             
 // right parenthesis             
} else if (token.equals(")")) {                
 while ( ! stack.peek().equals("("))                     
output.append(stack.pop()).append(' ');                 
stack.pop();              
// digit            
 } else {                 
output.append(token).append(' ');            
 }         
}         
 while ( ! stack.isEmpty())             
output.append(stack.pop()).append(' ');         
 output.toString()
Output.setText(output)
return Output
 }  
}
Das "rumgeschreibsel" am Schluss mit dem Output ist da deswegen, weil ich das Ergebnis des Shunting Yards in einem TextView ausgeben will und output ein String, Output ein TextView ist...

Ich hoffe wirklich, dass mir jemand helfen kann! :)

Dachte schon, dass es vielleicht daran liegen kann, dass die Operatoren-Zuordnung nicht in dem Textview liegt, welches ausgeführt wird...aber finde auch keine Möglichkeit, die Zuordnung in die Textview-Methode zu bringen..:(
 
Zuletzt bearbeitet:

Ähnliche Themen

B
Antworten
0
Aufrufe
689
basementmedia
B
P
Antworten
6
Aufrufe
1.082
Phillip1996
P
Zurück
Oben Unten