Les tracés de fonction JavaFX sont différents de ceux de Wolfram Alpha


J'ai créé une application de calculatrice qui est censée tracer des graphiques.L'utilisateur obtient une zone de texte où il peut entrer une formule de fonction, qui est ensuite validée et analysée en ChartXY et ainsi de suite pour la dessiner.Fondamentalement, j'utilise pour toutes mes bibliothèques de fonctions de javafx.J'ai remarqué que mes résultats sont très différents.La plupart des fonctions fonctionnent très bien mais certaines fonctions diffèrent, c'est comme si j'avais une partie réelle + une partie imaginaire mais wolfram a aussi ajouté sa réflexion miroir.S'il vous plait regardez mes capture.

Cet exemple est en ce qui concerne log(x) domaine (-6,6) arrivée (-2,2)

Graphe complexe Wolfram Alpha: http://oi61.tinypic.com/2uij7l2.jpg

Capture d'écran de mon application calculatrice: http://oi62.tinypic.com/2m7xoi9.jpg

Est un Autre exemple de log(sin(x)) domaine(-6.3,6.3) arrivée (-7,2)

Wolfram réel: http://oi57.tinypic.com/2a5hoif.jpg

Wolfram complexe: http://oi59.tinypic.com/kesq49.jpg

Capture d'écran de ma calculatrice: http://oi58.tinypic.com/2v13qpu.jpg

Arctan(tan(x)) pour le domaine(-6.3,6.3) arrivée(-2,2)

Wolfram parcelle: http://oi58.tinypic.com/hupze0.jpg

Mon tracé d'application: http://oi62.tinypic.com/8wktmr.jpg

Ma question est: Est-ce censé être comme ça, sinon alors pourquoi est-ce comme ça et peut-il être corrigé ?

Voici une partie de ma classe qui contient toute l'analyse

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);
    }
Author: user61139, 2015-02-14

1 answers

WA est correct. Dans le composant imaginaire, qui est arg (z), il devrait y avoir un saut de pi à 0 à z=0. Le composant réel est log(|z|).

Devinez dans le bleu: Assurez-vous d'utiliser arctan2 lors du calcul des angles.

 1
Author: LutzL, 2015-02-14 05:25:17