EDIT: 2/13/15: I made some improvements to the logic. Check the zip for the inputs_213.m file.
Here's a MATLAB based suspension geometry analyzer I wrote. I'll edit the first post with answers to questions, or subsequent updates to the code.
You can get Octave (free) here:
http://mxeoctave.osuv.de/octave-3.8.2-4-installer.exe Directions (please let me know if these don't do the trick and we'll work through it)
-Install Octave from the link above. You want to use this version since it's Windows compatible (I tested it on 7 and

and includes a GUI (graphical user interface). The latest public Windows release doesn't have the GUI, and QT Octave (the one I used a few years ago and loved.....) is no longer supported.
-When installing, let Octave register the *.m extension.
-After installing, run the "Experimental GUI Octave" version.
-Once you're in, you'll see a file browser on the left column, navigate to the folder where you unzipped the optimzer. (double click on the folder to open it)
-Double click on inputs.m. This will open the main optimizer file where you can edit your inputs and the optimizer parameters. It'll open in the right window (notice the tabs on the bottom of the screen "Command Window/Editor/Documentation".
-Once you're satisfied with the edits you made, hit F5. This will save the modified inputs file and run it. I recommend renaming yours so you have the original, and one for the front and one for the rear. It'll make doing iterations way easier.
-After you hit F5 (or click run), click on the command window tab I explained above. Now you wait. It'll take 10-15 minutes to run (much faster in MATLAB, but Octave must either just be slower or is using fewer cores maybe? If somebody has an idea how to speed this up, I'm listening). You'll get a series of warnings, but you don't need to worry. The error is caused by the program trying to take the inverse of of a singular matrix, and also division by zero. If you're using real values for caster and anti-dive, you won't get any errors.
-When the program is done, the results will appear in the command window. Post up your results and we can expand on what they mean and if there are any changes to your boundary conditions that will improve your results.
EDITED: Original Post Below
Alright, I should probably share this with the community. I wrote a suspension geometry optimizer for a graduate project in MATLAB. It allows the user to input their desired: tire size, wheel offset, static camber, caster, lower control arm mount limits, ride height, and spindle dimensions. You can change the weight of the various outputs to your desired design constraints. In my case, I wanted to minimize roll center migration (vertical and lateral) while maintaining negative camber at 3 degrees roll. It can do anti-dive as well (and I can make it do anti-squat for the rear if anyone is interested...), but the "anti" portion needs some work.* (geeky explanation below)
The output of the program is a set of points in that you can use to set the axes of your control arms relative to the wheel position. If there's interest in the program, I need to spend a little time cleaning up the outputs and maybe having it write to an excel file so it's easier to interpet. If there's no interest, then I won't spend the time doing that (or if you're OK with MATLAB you can easily figure how it's displaying the results).
*Anti effects are a function of the inclination of the upper and lower control arms. As such, if we generate a random inclination of the UCA, there is only one inclination of the LCA that gets the desired anti effect. The optimizer is built to run a random set of locations within the design space and choose the best. To get better results, the optimizer should be run, and a correlation derived for the LCA angle as a function of the randomly generated UCA angle. I did this for a few points, but didn't bother writing the code to do this automatically (shouldn't be too hard, just didn't have the time or motivation when I was doing the project, and it's suitable for my needs as is).