Which board are you using? If the board is based on an AVR (e.g. Mega, Uno, Leonardo) and the values are fixed, you can store them in PROGMEM.
You will have to show you complete sketch. The reason that you can't use more than 20 particles is probably because of the graphics library that you're using; those libraries chew memory.
As positions on the screen are in integeres, is there a need to use floats? Reducing to int (int16_t) would allow you to double the amount of particles.
A better way to store related information is the use of a struct or class. I'm more familiar with struct.
// macro to calculate number of elements in array of any type
#define NUMELEMENTS(x) (sizeof(x) / sizeof(x[0]))
struct PARTICLE
{
float dx;
float dy;
float yPos;
float xPos;
};
PARTICLE particles[] =
{
{3.14, 2.71, 5.0, 11.3},
{101.0, 202.0, 1000.0, 33.3},
};
void setup()
{
Serial.begin(57600);
while (!Serial);
Serial.print("There are ");
Serial.print(NUMELEMENTS(particles));
Serial.println(" particles");
for (uint8_t cnt = 0; cnt < NUMELEMENTS(particles); cnt++)
{
Serial.print("\tdx = "); Serial.print(particles[cnt].dx);
Serial.print(", dy = "); Serial.print(particles[cnt].dy);
Serial.print(", xPos = "); Serial.print(particles[cnt].xPos);
Serial.print(", yPos = "); Serial.println(particles[cnt].yPos);
}
}
void loop()
{
}
Note that this still will use the same amount of memory. Also note that te variable particles is different from your one.