So, I found a valid solution myself. Not sure if it's the best solution, but it's functional.
To answer my question, scipy.optimize.fsolve takes a parameter args = (extra arguments here). I put the predetermined parameters in here. When the function is called, the args are first parsed and the 3 predetermined values placed in the appropriate spot.
The remaining 6 variables are passed in a list, and are iterated over to fill the remaining gaps. Since the arguments are not changing, each variable is always placed in the same spot in the matrix.
Using this method, any 3 matrix elements can be predetermined, and fsolve will attempt to determine the remainder.
The calling statement for fsolve looks like this:
paramSolve1, infodict, ier, mesg = scipy.optimize.fsolve(func,(i,i,i,i,i,i),args = (knownVals[0],knownVals[1],knownVals[2]), full_output = True, warning = False)
knwonVals is a list of predetermined parameters, and i is a starting guess (all 6 missing parameters get the same starting guess). full_output allows the optional outputs to be returned, and warning = False turns off the warning message present when a solution isn't found. For more information, check out http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.fsolve.html
For those interested, the entire code for the problem is below.
import scipy
from scipy.optimize import fsolve
def func(params, *args):
c = propMatrix(createMatrix(args), params)
ans =(scipy.dot(c[:, 0],c[:, 1]), scipy.dot(c[:, 1],c[:, 2]), scipy.dot(c[:, 0],c[:, 2]),scipy.dot(c[:, 0],c[:, 0])-1,scipy.dot(c[:, 1],c[:, 1])-1,scipy.dot(c[:, 2],c[:, 2])-1)
return ans
def createMatrix(knownVals):
c = [['____', '____', '____'],['____', '____', '____'], ['____', '____', '____']]
for element in knownVals:
x, y, val = element
c[y][x] = float(val)
return c
def propMatrix(c, params):
for p in params:
assign = True
for x in range(3):
for y in range(3):
if c[x][y]=='____' and assign:
c[x][y] = float(p)
assign = False
return scipy.array(c)
def test(c):
v1 = c[:, 0]
v2 = c[:, 1]
v3 = c[:, 2]
h1 = c[0, :]
h2 = c[1, :]
h3 = c[2, :]
ans = (scipy.dot(v1,v1)-1, scipy.dot(v1,v2), scipy.dot(v1, v3), scipy.dot(v2, v2)-1, scipy.dot(v2, v3), scipy.dot(v3,v3)-1, scipy.dot(h1,h1)-1, scipy.dot(h1,h2), scipy.dot(h1, h3), scipy.dot(h2, h2)-1, scipy.dot(h2, h3), scipy.dot(h3,h3)-1)
return ans
def getInput():
knownVals = []
print """\n\nThis module analytically solves for the rotation matrix\n
First, enter 3 known values of the matrix:\n
x
1 2 3
1 | c11 c12 c13 |
y 2 | c21 c22 c23 |
3 | c31 c32 c33 |\n\n"""
for i in range(3):
invalid = True
print "Point Number %i:"%(i)
while invalid:
x = int(raw_input("\tx-coordinate:"))-1
if x>2 or x<0:
print "\tInvalid x-coordinate."
else:
invalid = False
invalid = True
while invalid:
y = int(raw_input("\ty-coordinate:"))-1
if y>2 or y<0:
print "\tInvalid y-coordinate."
else:
invalid = False
invalid = True
while invalid:
val = float(raw_input("\tValue:"))
if val>1 or val<-1:
print "\tInvalid value. Must be -1 <= value <= 1"
else:
invalid = False
knownVals.append((x, y, val))
c = createMatrix(knownVals)
print "Input Matrix:\n\n", scipy.array(c)
choice = raw_input("\nIs this correct (y/n)? ")
if choice == "y":
return knownVals
elif choice == "n":
return getInput()
def Main():
solution = False
knownVals = getInput()
for i in (-1,-.5,0,.5,1):
paramSolve1, infodict, ier, mesg = scipy.optimize.fsolve(func,(i,i,i,i,i,i),args = (knownVals[0],knownVals[1],knownVals[2]), full_output = True, warning = False)
if ier == 1:
print "\nInitial value: %r"%(i)
print propMatrix(createMatrix(knownVals),paramSolve1)
solution = True
if not solution:
print "Could not find a valid solution"
scipy.set_printoptions(precision = 4, suppress = True)
Main()