I'm reviewing a car transmission model for a basic racing game, and I've noticed a slight discrepancy between what I would expect of the macroscopic properties of the model (when changing gear) and the numerical results.
Here is the basic model:
from math import pi import numpy as np class Car: gearRatios =  maxTorqueArray =  rpmAtMaxTorque =  wheelRadius = 0.0 differentialRatio = 0.0 Cd = 0.0 Crr = 0.0 transmissionEfficiency = 0.0 mass = 0 def __init__(self): self.speed = 0.0 self.acceleration = 0.0 self.currentGear = 1 def update(self, dt): throttle = 1.0 # Gear ratios assert self.currentGear > 0 currentGearRatio = self.gearRatios[self.currentGear - 1] effectiveGearRatio = self.differentialRatio * currentGearRatio transmission = effectiveGearRatio * self.transmissionEfficiency wheelCircumference = 2 * pi * self.wheelRadius # Find RPM wheelRPM = (self.speed / wheelCircumference) * 60 engineRPM = wheelRPM * transmission engineRPM = min(max(engineRPM, self.rpmAtMaxTorque), self.rpmAtMaxTorque[-1]) # Find torque at RPM maxTorque = np.interp(engineRPM, self.rpmAtMaxTorque, self.maxTorqueArray) engineTorque = maxTorque * throttle wheelTorque = engineTorque * transmission tractionForce = wheelTorque / self.wheelRadius # Resolve forces dragForce = -self.Cd * self.speed * abs(self.speed) rollingResistanceForce = -self.Cd * 30 * self.speed # Resultant resultantForce = tractionForce + dragForce + rollingResistanceForce self.acceleration = resultantForce / self.mass self.speed += self.acceleration * dt self.currentForce = resultantForce self.currentRPM = engineRPM self.currentSpeed = self.speed self.currentTorque = wheelTorque class BoxsterS2004(Car): gearRatios = [3.82, 2.20, 1.52, 1.22, 1.02, 0.84] maxTorqueArray = [220, 220, 310, 220] rpmAtMaxTorque = [0, 1000, 4500, 6600] wheelRadius = 0.345 differentialRatio = 3.42 Cd = 0.32 transmissionEfficiency = 0.7 mass = 1300 if __name__ == "__main__": car = BoxsterS2004() dt = 1 / 60 while True: car.update(dt)
Now, in it's actual implementation, I'm running the update function in a fixed-step game loop, which allows me to inspect the car state and shift gear at runtime.
Now, the behaviour:
It is to be expected that the force of the car drops according to the speed for the same power.
It is also to be expected that the car cannot reach as high a speed in lower gears.
Yet, for these parameters, the top speed can only be reached in 1st gear, and decelerates according as the gears are shifted higher.
I'm not sure why this happens. It makes sense that the acceleration rate is lesser for higher speeds, because the drag force is proportional to v^2, and the force of the engine falls with higher gears, but my resultant forces are negative for higher gears when they're not for the lower gears. Shifting at any point reduces the max speed achievable.
Evidently, I don't quite understand the model well enough, could anyone point me in the right direction?
To my mind, given that the driving force of the car falls off at