2015-11-13 4 views
1

Я использую JFreeChart построить некоторые уравнения, как: х - х^2 Я использую этот код: (слегка модифицированный приведенный пример)JFreeChart участка натурального логарифм е

double[] a = {0.0, 1.0, -1.0}; // By the model: y = a0 + a1 * x + a2 * x^2 + ... + an * x^n 
Function2D p = new PolynomialFunction2D(a); // create function 
XYDataset dataset = DatasetUtilities.sampleFunction2D(p, -5.0, 5.0, 50, "Function"); 
final JFreeChart chart = ChartFactory.createXYLineChart("Equation","X","Y",dataset,lotOrientation.VERTICAL,true,true,false); 

Как я построить это уравнение? е (х) = п (х + 3) +3 и е^х - 2 * х

+0

Вы можете создать свой собственный точки и график, если вы не можете найти реализацию Function2D для своего уравнения. – vsnyc

ответ

3

Update: Java 8 Решение Я оставил старое решение, как ниже. Если ваши функции для построения являются одноразовыми выражениями, которые вы не хотите поддерживать в качестве отдельных классов, в Java 8 вы можете реализовать Function2D как выражение лямбда.

Например ln(x+3)+3 будет записано как:

double[] a = {1.0, 3.0, 3.0}; 
XYDataset dataset = DatasetUtilities.sampleFunction2D(v -> Math.log(a[0]* v + a[1]) + a[2], 1.0, 5.0, 50, "Function"); 
final JFreeChart chart = ChartFactory.createXYLineChart("Equation", "X", "Y", dataset, PlotOrientation.VERTICAL, true, true, false); 

Оригинальный ответ:

Вы можете реализовать свои собственные функции для выполнения этой заговоры. Например, для ln(x+3)+3 вы можете иметь что-то вроде ниже:

public class LogLinearFunction2D implements Function2D { 
    //Plot ln(ax + b) + c 
    double a; 
    double b; 
    double c; 
    public LogLinearFunction2D(double[] params) { 
     if(params.length != 3) throw new RuntimeException("Invalid parameters, expected array count 3"); 
     this.a = params[0]; 
     this.b = params[1]; 
     this.c = params[2]; 
    } 
    @Override 
    public double getValue(double v) { 
     return Math.log(a* v + b) + c; 
    } 
} 

И тогда вы можете использовать это, чтобы построить график функции с помощью фрагмента кода:

double[] a = {1.0, 1.0, -1.0}; 
    Function2D p = new LogLinearFunction2D(a); // create function 
    XYDataset dataset = DatasetUtilities.sampleFunction2D(p, 1.0, 5.0, 50, "Function"); 
    final JFreeChart chart = ChartFactory.createXYLineChart("Equation", "X", "Y", dataset, PlotOrientation.VERTICAL, true, true, false); 
    ChartUtilities.saveChartAsPNG(new File("test.png"), chart, 500, 500); 

Аналогично для e^x - 2*x, вы можете иметь следующий Function2D реализация обобщен для построения a*e^x + b*x + c и передать массив double[] a = {1.0, -2.0, 0}

private static class ExpLinearFunction2D implements Function2D { 
    //Plot a*e^x + b*x + c 
    double a; 
    double b; 
    double c; 
    public ExpLinearFunction2D(double[] params) { 
     if(params.length != 3) throw new RuntimeException("Invalid parameters, expected array count 3"); 
     this.a = params[0]; 
     this.b = params[1]; 
     this.c = params[2]; 
    } 
    @Override 
    public double getValue(double v) { 
     return a * Math.exp(v) + b * v + c; 
    } 
} 
+0

Это очень неплохо, вам нужно взять правильный диапазон, хотя при высоком максимальном значении график становится искаженным, так как e^x становится очень большим. например попробуйте этот диапазон, он сопоставляет график, созданный [Wolfram Alpha] (https://www.wolframalpha.com/share/clip?f=d41d8cd98f00b204e9800998ecf8427efjgr20ic5m) 'XYDataset dataset = DatasetUtilities.sampleFunction2D (v -> a [0] * Math. exp (v) + a [1] * v + a [2], -3,0, 3,0, 1000, «Функция»); – vsnyc

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