5,530
社区成员
发帖
与我相关
我的任务
分享
public abstract class Model {
// z=(x,v)
public static double[][] update(double[][] positionvelocity, double h,
Vehicle[] vehicleArray) {
int numbervehicles = Controller.n_veh;
double[][] positionvelocitynew = new double[positionvelocity.length][2];
// speichert auf [i][0]-Positionen und auf [i][1]-Geschwindigkeit
double k1;
double k2;
double k3;
double k4;
double w1;
double w2;
double w3;
double w4;
double[] temp;
for (int i = 0; i < numbervehicles - 1; i++) {
temp = f(positionvelocity[i][0], positionvelocity[i][1],
positionvelocity[i + 1][0], positionvelocity[i + 1][1],
vehicleArray[i]);
k1 = h * temp[0];
w1 = h * temp[1];
temp = f(positionvelocity[i][0], positionvelocity[i][1] + w1 / 2,
positionvelocity[i + 1][0], positionvelocity[i + 1][1],
vehicleArray[i]);
k2 = h * (temp[0] + w1 / 2);
w2 = h * temp[1];
temp = f(positionvelocity[i][0], positionvelocity[i][1] + w2 / 2,
positionvelocity[i + 1][0], positionvelocity[i + 1][1],
vehicleArray[i]);
k3 = h * (temp[0] + w2 / 2);
w3 = h * temp[1];
temp = f(positionvelocity[i][0], positionvelocity[i][1] + w3,
positionvelocity[i + 1][0], positionvelocity[i + 1][1],
vehicleArray[i]);
k4 = h * (temp[0] + w3);
w4 = h * temp[1];
positionvelocitynew[i][0] = positionvelocity[i][0] + k1 / 6 + k2
/ 3 + k3 / 3 + k4 / 6;
positionvelocitynew[i][1] = positionvelocity[i][1] + w1 / 6 + w2
/ 3 + w3 / 3 + w4 / 6;
// Teste ob Auto recht herausf鋒rt:
if (positionvelocitynew[i][0] > (Controller.winwidth + vehicleArray[i]
.getlength())) {
positionvelocitynew[i][0] = positionvelocitynew[i][0]
- Controller.winwidth;
}
// Teste ob Auto r點kw鋜ts f鋒rt
if (positionvelocitynew[i][1] < 0) {
positionvelocitynew[i][1] = 0;
}
}
temp = f(positionvelocity[numbervehicles - 1][0],
positionvelocity[numbervehicles - 1][1],
positionvelocity[0][0], positionvelocity[0][1],
vehicleArray[numbervehicles - 1]);
k1 = h * temp[0];
w1 = h * temp[1];
temp = f(positionvelocity[numbervehicles - 1][0],
positionvelocity[numbervehicles - 1][1] + w1 / 2,
positionvelocity[0][0], positionvelocity[0][1],
vehicleArray[numbervehicles - 1]);
k2 = h * (temp[0] + w1 / 2);
w2 = h * temp[1];
temp = f(positionvelocity[numbervehicles - 1][0],
positionvelocity[numbervehicles - 1][1] + w2 / 2,
positionvelocity[0][0], positionvelocity[0][1],
vehicleArray[numbervehicles - 1]);
k3 = h * (temp[0] + w2 / 2);
w3 = h * temp[1];
temp = f(positionvelocity[numbervehicles - 1][0],
positionvelocity[numbervehicles - 1][1] + w3,
positionvelocity[0][0], positionvelocity[0][1],
vehicleArray[numbervehicles - 1]);
k4 = h * (temp[0] + w3);
w4 = h * temp[1];
positionvelocitynew[numbervehicles - 1][0] = positionvelocity[numbervehicles - 1][0]
+ k1 / 6 + k2 / 3 + k3 / 3 + k4 / 6;
positionvelocitynew[numbervehicles - 1][1] = positionvelocity[numbervehicles - 1][1]
+ w1 / 6 + w2 / 3 + w3 / 3 + w4 / 6;
// Test ob Auto recht herausf鋒rt
if (positionvelocitynew[numbervehicles - 1][0] > (Controller.winwidth + vehicleArray[numbervehicles - 1]
.getlength())) {
positionvelocitynew[numbervehicles - 1][0] = positionvelocitynew[numbervehicles - 1][0]
- Controller.winwidth;
}
// Teste ob Auto r點kw鋜ts f鋒rt
if (positionvelocitynew[numbervehicles - 1][1] < 0) {
positionvelocitynew[numbervehicles - 1][1] = 0;
}
return positionvelocitynew;
}
public static double[] f(double x1, double v1, double x2, double v2,
Vehicle auto) {
double a;
double b;
double T;
double s_ref;
double v_ref;
double length;
double delta;
double deltav;
double salpha;
double sfunk;
a = auto.geta();
b = auto.getb();
T = auto.getdt();
s_ref = auto.gets_ref();
length = auto.getlength();
v_ref = auto.getv_ref();
delta = auto.getdelta();
deltav = v1 - v2;
salpha = x2 - length - x1;
// Falls diese Auto am rechten Rand ist
if (salpha < 0) {
salpha = x2 - length + Controller.winwidth - x1;
}
sfunk = (s_ref + v1 * T + v1 * deltav) / (2 * Math.sqrt(a * b));
double[] result = {
v1,
a
* (1 - Math.pow(v1 / v_ref, delta) - Math.pow(sfunk
/ salpha, 2)) };
return result;
}
}