2015-02-14 2 views
1

Я создал приложение калькулятора, которое должно строить график. Пользователь получает текстовое поле, где он может вводить формулу функции, которая затем проверяется и анализируется на ChartXY и т. Д., Чтобы нарисовать ее .Basicaly Я использую для всех моих библиотек функций из javafx. Я заметил, что мои результаты совсем разные. Большинство функций работают очень хорошо, но некоторые функции различаются, это похоже на то, что у меня есть реальная часть + мнимая часть, но вольфрам также имеет зеркало отражение добавлено. Следите за моими скриншотами.Графики функций JavaFX отличаются от графиков функций Wolfram Alpha

Этот пример касается журнала (х) области (-6,6) кообласть (-2,2)

Wolfram Alpha сложный график: http://oi61.tinypic.com/2uij7l2.jpg

Мой скриншот приложение калькулятор: http://oi62.tinypic.com/2m7xoi9.jpg

Другой пример для журнала (син (х)) домен (-6.3,6.3) кообласть (-7,2)

Вольфрам реально: http://oi57.tinypic.com/2a5hoif.jpg

Wolfram комплекс: http://oi59.tinypic.com/kesq49.jpg

Мой скриншот калькулятор: http://oi58.tinypic.com/2v13qpu.jpg

арктангенс (загар (х)) для домена (-6.3,6.3) кообласть (-2,2)

Wolfram участок: http://oi58.tinypic.com/hupze0.jpg

Моя заявка участка: http://oi62.tinypic.com/8wktmr.jpg

Мой вопрос: является ли это предположить, d быть таким, если нет, то почему это так и может быть исправлено?

Вот часть моего класса, который содержит весь разбор

public class Controller { 

@FXML 
private TextField domainTextField; 
@FXML 
private TextField codomainTextField; 
@FXML 
private LineChart coordinateLineChart; 
@FXML 
private TextField functionTextField; 
@FXML 
private NumberAxis xNumberAxis; 
@FXML 
private NumberAxis yNumberAxis; 
@FXML 
private ComboBox lineStyleComboBox; 
@FXML 
private ComboBox lineThiknessComboBox; 
@FXML 
private ColorPicker colorPicker; 
@FXML 
private Pane numericPane; 
@FXML 
private TextField descriptionTextField; 
@FXML 
private Label descriptionLabel; 
@FXML 
private VBox legendVBox; 
@FXML 
private CheckBox modificationModeCheckBox; 
@FXML 
private AnchorPane toSnapshot; 

Stage stage; 
MessageBox msgBox; 
Intervals intervals = new Intervals(); 
LinkedList<FunctionViewHelper> functions = new LinkedList<FunctionViewHelper>(); 
boolean axisXdescriptionFlag = true; 
boolean editingMode = false; 
int editingFunctionId = 0; 
int fontFactor = 0; 
ObservableList<XYChart.Series> seriesListChart = FXCollections.observableArrayList(); 
ArrayList<XYChart.Series> lastSeries = new ArrayList<XYChart.Series>(); 
ArrayList<CustomFunction> exp4jCustomFunction = new ArrayList<CustomFunction>(); 

// Draws a graph 
private void drawFormula(Calculable expression, ArrayList<String> conditions, String cssStyle) throws ScriptException { 
    ArrayList<XYChart.Series> seriesList = new ArrayList<XYChart.Series>(); 
    seriesList.add(new XYChart.Series()); 
    double lastY = 0; 
    for (double x = intervals.domainStart; x < intervals.domainEnd; x += 0.009) { 
     if (Validator.ifAllConditionsTrue(conditions, x)) { 
      if (x != intervals.domainStart) lastY = expression.calculate(); 
      expression.setVariable("x", x); 
      if (Math.abs(lastY - expression.calculate()) > Const.brakeLineConst) 
       seriesList.add(new XYChart.Series()); 
      seriesList.get(seriesList.size() - 1).getData().add(new XYChart.Data(x, expression.calculate())); 
     } 
    } 

    seriesListChart.addAll(seriesList); 
    lastSeries.addAll(seriesList); 

    setSeriesStyle(seriesList, cssStyle); 
} 

// Parsing string to Calculable which we can draw. 
    private Calculable buildExpression(String expression) throws UnparsableExpressionException, UnknownFunctionException { 
     return new ExpressionBuilder(expression) 
       .withVariableNames("x") 
       .withCustomFunctions(exp4jCustomFunction) 
       .build(); 
    } 
private void drawButtonHandler() { 
     //TODO remove 
     //domainTextFieldOnChange(); 
     Function function = null; 
     if (!Validator.validateFofEmptyFields(domainTextField, functionTextField)) { 
      msgBox.show("You have to specify domain and formula."); 
      return; 
     } 
     if (!Validator.validateIntervals(intervals, codomainTextField)) { 
      msgBox.show("Specify proper domain and codomain."); 
      return; 
     } 
     try { 
      if (!editingMode) { 
       function = new Function(functionTextField.getText(), colorPicker.getValue(), (String) lineStyleComboBox.getValue(), 
         lineThiknessComboBox.getValue().toString()); 
       colorPicker.setValue(Const.getNextColor()); 
      } else { 
       function = getByFunctionId(editingFunctionId).function; 
       function.formula = functionTextField.getText(); 
       seriesListChart.removeAll(getByFunctionId(editingFunctionId).series); 
      } 
      ArrayList<String> conditions = new ArrayList<String>(); 
      drawFunctionReq(function.formula, conditions, function.getCss()); 
      if (!editingMode) 
       functions.add(new FunctionViewHelper(function, addLegendFunctionView(function), new ArrayList<XYChart.Series>(lastSeries))); 
      else { 
       getByFunctionId(editingFunctionId).series = new ArrayList<XYChart.Series>(lastSeries); 
       ((Label) getByFunctionId(editingFunctionId).view.getChildren().get(1)).setText(function.formula); 
      } 
     } catch (UnknownFunctionException ex) { 
      ex.printStackTrace(); 
      msgBox.show("Unknown function."); 
     } catch (UnparsableExpressionException ex) { 
      ex.printStackTrace(); 
      msgBox.show("Unparsable expression."); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
      msgBox.show("Unknown error."); 
     } finally { 
      lastSeries.clear(); 
     } 
    } 
@FXML 
    private void domainTextFieldOnChange() { 
     domainTextField.setStyle(""); 
     try { 
      intervals.setDomain(domainTextField.getText()); 
      xNumberAxis.lowerBoundProperty().set(intervals.domainStart); 
      xNumberAxis.upperBoundProperty().set(intervals.domainEnd); 
     } catch (Exception e) { 
      domainTextField.setStyle("-fx-focus-color: red;"); 
      e.printStackTrace(); 
     } 
    } 

    @FXML 
    private void codomainTextFieldOnChange() { 
     codomainTextField.setStyle(""); 
     if (!codomainTextField.getText().isEmpty()) { 
      try { 
       intervals.setCodomain(codomainTextField.getText()); 

       yNumberAxis.setAutoRanging(false); 
       yNumberAxis.setUpperBound(intervals.codomainEnd); 
       yNumberAxis.setLowerBound(intervals.codomainStart); 
      } catch (Exception e) { 
       codomainTextField.setStyle("-fx-focus-color: red;"); 
       e.printStackTrace(); 
      } 
     } else yNumberAxis.setAutoRanging(true); 
    } 
+0

В чем вопрос? – jewelsea

+0

Мне жаль, что поздно ... Теперь это исправлено. – user61139

ответ

1

WA является правильным. В мнимой компоненте, которая является arg (z), должен быть скачок от pi до 0 при z = 0. Реальным компонентом является log (| z |).

Угадай, что нужно использовать arctan2 при вычислении углов.

+0

Спасибо за ваш ответ. Я добавил код анализа из своего приложения. Я действительно не вижу, как я могу это исправить, потому что похоже, что проблема в библиотеке. Можете ли вы сказать мне, можно ли его устранить после того, как вы посмотрели код? – user61139

+0

Вы уверены, что ваш оценщик выражений использует функции над комплексными числами? Кажется, что для отрицательного x вы получаете «ничего» в качестве результата. – LutzL

+0

Сначала я был уверен, что я этого не делаю, но теперь я действительно смущен, потому что там появляется прямоугольная функция формы (которая из того, что я знаю, не является реальной частью). – user61139

Смежные вопросы