Hi,
könnte mal jemand schauen, was hier nicht stimmt?
package org.example;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
public class DataFit {
public static double calcY(double i, Double[] d) {
return d[0] * i * i * i + d[1] * i * i + d[2] * i + d[3];
}
public static double calcE(double[][] xys, Double[] d) {
double sum = 0;
for (double[] xy : xys) {
sum += Math.abs(calcY(xy[0], d) - xy[1]);
}
return sum;
}
public static double check(double bestE, Double[] best, ArrayList<Double[]> bests, double[][] xys) {
double e = calcE(xys, best);
if (e < bestE) {
bests.add(best);
System.out.println("e = " + e);
return e;
}
return 10000;
}
public static ArrayList<Double[]> fit(double[][] xys) {
ArrayList<Double[]> bests = new ArrayList<>();
double bestE = 10000;
for (int i = 0; i <= 5000; i++) {
System.out.println("i = " + i);
for (int j = 0; j <= 5000; j++) {
int c2 = 0;
for (int k = 0; k <= 5000 && c2 < 10; k++) {
int c1 = 0;
for (int l = 0; l <= 5000 && c1 < 5; l++) {
Double[] best1 = {i / 100d, j / 100d, k / 100d, l / 100d};
Double[] best2 = {-i / 100d, -j / 100d, -k / 100d, -l / 100d};
double oldE = bestE;
bestE = Math.min(bestE, check(bestE, best1, bests, xys));
bestE = Math.min(bestE, check(bestE, best2, bests, xys));
if (oldE == bestE) {
c1++;
c2++;
}
else {
c1 = 0;
c2 = 0;
}
if (bests.size() > 20) {
bests.sort(Comparator.comparingDouble(a -> calcE(xys, a)));
while (bests.size() > 10) {
bests.remove(bests.size() - 1);
}
}
}
}
}
}
bests.sort(Comparator.comparingDouble(a -> calcE(xys, a)));
while (bests.size() > 10) {
bests.remove(bests.size() - 1);
}
return bests;
}
public static void main(String[] args) {
ArrayList<Double[]> bests1 = fit(new double[][]{{0, 4.5}, {4, 43}, {8, 80}, {12, 100}});
for (Double[] best : bests1) {
System.out.println(Arrays.toString(best));
}
}
}
Mit Zeile 45 bis 52 erhalte ich folgendes Ergebnis: [0.0, 0.43, 0.0, 36.13]
, was falsch ist, bzw. nicht optimal.
Wenn ich Zeile 45 bis 52 auskommentiere, hält die Anwendung nicht an.
Gesucht ist ein Polygon 4. Grades ( ax^3 + bx^2 + cx + d
) mit der geringsten Standardabweichung für folgende Datenwerttabelle:
x | y | |
---|---|---|
0 | 4.5 | |
4 | 43 | |
8 | 80 | |
12 | 100 |
Ferner soll noch bestimmt werden, ob die Kurve logarithmisch verläuft oder nicht.