I'm working on making an iOS app to solve physics problems and I'm starting by just having it solve basic kinematics problems with the following formulas (I've coded it in C instead of Swift to start because I know C better):
- Time: \$t\$
- Change in Distance: \$d\$
- Average Velocity: \$v_a\$
- Initial Velocity: \$v_i\$
- Final Velocity: \$v_f\$
- Acceleration: \$a\$
- \$v_a = \frac{v_f + v_i}{2}\$
- \$v_f^2 = v_i^2 + 2ad\$
- \$d = v_it + \frac{1}{2}at^2\$
- \$a = \dfrac{v_f - v_i}{t}\$
- \$v_a = \frac{d}{t}\$
I'm using the following code to solve for as many of the variables as possible once the given variables have been input. The array being passed in contains the variables I showed above in the same order. The boolean values such as tChanged
or vaChanged
are initialized as false and then changed to true if the user inputs a value for them or if my algorithm assigns them a value:
void calculateUnknowns1(double values[6])
{
int i = 0;
do{
i = 0;
/*-------------------------------------------DERIVED FROM: va = (vf+vi)/2----------------------------------------------------*/
if((vfChanged)&&(viChanged)){
if(!vaChanged){
values[2] = (values[4]+values[3]) / 2;
i++;
vaChanged = true;
}
}
if((vaChanged)&&(viChanged)){
if(!vfChanged){
values[4] = 2*values[2] - values[3];
i++;
vfChanged = true;
}
}
if((vaChanged)&&(vfChanged)){
if(!viChanged){
values[3] = 2*values[2] - values[4];
i++;
viChanged = true;
}
}
/*----------------------------------------DERIVED FROM: vf*vf = vi*vi + 2*a*d------------------------------------------------*/
if((viChanged)&&(aChanged)&&(dChanged)){
if(!vfChanged){
values[4] = sqrtl(values[3]*values[3] + 2*values[5]*values[1]);
i++;
vfChanged = true;
}
}
if((vfChanged)&&(aChanged)&&(dChanged)){
if(!viChanged){
values[3] = sqrtl(values[4]*values[4] - 2*values[5]*values[1]);
i++;
viChanged = true;
}
}
if((viChanged)&&(vfChanged)&&(aChanged)){
if(!dChanged){
values[1] = (values[4]*values[4] - values[3]*values[3]) / (2*values[5]);
i++;
dChanged = true;
}
}
if((viChanged)&&(vfChanged)&&(dChanged)){
if(!aChanged){
values[5] = (values[4]*values[4] - values[3]*values[3]) / (2*values[1]);
i++;
aChanged = true;
}
}
/*-------------------------------------------DERIVED FROM: d = vit+1/2at*t---------------------------------------------------*/
/*if((tChanged)&&(dChanged)&&(values[3]==0)){
if(!aChanged){
values[5] = values[1]/(0.5*values[0]*values[0]);
i++;
aChanged = true; EXTRANNEOUS
}
}
if((tChanged)&&(dChanged)&&(values[5]==0)){
if(!viChanged){
values[3] = values[1]/values[0];
i++;
viChanged = true;
}
}*/
if((tChanged)&&(viChanged)&&(aChanged)){
if(!dChanged){
values[1] = values[3]*values[0] + 0.5*values[5]*values[0]*values[0];
i++;
dChanged = true;
}
}
if((tChanged)&&(dChanged)&&(aChanged)){
if(!viChanged){
values[3] = (values[1] - 0.5*values[5]*values[0]*values[0]) / values[0];
i++;
viChanged = true;
}
}
if((tChanged)&&(dChanged)&&(viChanged)){
if(!aChanged){
values[5] = (values[1] - values[3]*values[0]) / (0.5*values[0]*values[0]);
i++;
aChanged = true;
}
}
if((dChanged)&&(viChanged)&&(aChanged)){
if(!tChanged){
values[0] = (-(values[3]) + sqrtl(values[3]*values[3] - 4*0.5*values[5]*(-values[1]))) / values[5];
if(!((values[1] == values[3]*values[0] + 0.5*values[5]*values[0]*values[0])&&(values[0]>=0))){
values[0] = (-(values[3]) - sqrtl(values[3]*values[3] - 4*0.5*values[5]*(-values[1]))) / values[5];
}
i++;
tChanged = true;
}
}
/*-------------------------------------------DERIVED FROM: a=(vf-vi)/t-------------------------------------------------------*/
if((vfChanged)&&(viChanged)&&(tChanged)){
if(!aChanged){
values[5] = (values[4]-values[3]) / values[0];
i++;
aChanged = true;
}
}
if((vfChanged)&&(viChanged)&&(aChanged)){
if(!tChanged){
values[0] = (values[4]-values[3]) / values[5];
i++;
tChanged = true;
}
}
if((vfChanged)&&(aChanged)&&(tChanged)){
if(!viChanged){
values[3] = values[4] - values[5]*values[0];
i++;
viChanged = true;
}
}
if((viChanged)&&(aChanged)&&(tChanged)){
if(!vfChanged){
values[4] = values[3] + values[5]*values[0];
i++;
vfChanged = true;
}
}
/*-------------------------------------------DERIVED FROM: va = d/t---------------------------------------------------------*/
if((dChanged)&&(tChanged)){
if(!vaChanged){
values[2] = values[1] / values[0];
i++;
vaChanged = true;
}
}
if((dChanged)&&(vaChanged)){
if(!tChanged){
values[0] = values[1] / values[2];
i++;
tChanged = true;
}
}
if((vaChanged)&&(tChanged)){
if(!dChanged){
values[1] = values[2]*values[0];
i++;
dChanged = true;
}
}
/*-------------------------------------------SOLVING FOR t WITH vi--------------------------------------------------------*/
if((aChanged)&&(vfChanged)&&(dChanged)){
if(!tChanged){
values[0] = (sqrtl(values[4]*values[4] - 2*values[5]*values[1]) + values[4]) / -(values[5]);
if(values[0]<=0){
values[0] = (sqrtl(values[4]*values[4] - 2*values[5]*values[1]) - values[4]) / -(values[5]);
}
i++;
tChanged = true;
}
}
}while(i>0);
}
This algorithm does work properly but it seems awfully inefficient to me. Can anyone suggest an alternative before I go further into forces and momentum?