I'm writing my own Newton-Raphson algorithm in Python using sympy
and numpy
.
The code is below but you can ignore this and skip on to the error:
CODE
def newtonRhapson(fncList, varz, x0):
jacob = []
for fnc in fncList:
vec = []
for var in varz:
res = fnc.diff(var)
for i in range(len(varz)):
res = res.subs(varz[i], x0[i])
vec.append(res)
jacob.append(numpy.array(vec, dtype='float64'))
fx0=[]
for fnc in fncList:
res2 = fnc
for i in range(len(varz)):
res2 = res2.subs(varz[i], x0[i])
fx0.append(res2)
j = jacob
f = fx0
print j
print ''
print f
print numpy.linalg.solve(j,f).tolist()
The arguments to the function are:
fncList
- a python list of functions using Sympy
symbols
varz
- a list containing those symbols (variables)
x0
- initial guess
ERROR
Up until the point where we print
j
and f
it works fine and prints the following:
[array([-9.13378682, -5.91269838]), array([ 4.84401379, 1.01980286])]
[-5.15598620617611, 5.13378681611922]
when I run:
newtonRhapson([5*cos(a)+6*cos(a+b)-10, 5*sin(a)+6*sin(a+b)-4], [a,b], [0.7,0.7])
But on running the line:
print numpy.linalg.solve(j,f).tolist()
I get the error:
File "/Users/me/anaconda/lib/python2.7/site- packages/numpy/linalg/linalg.py", line 384, in solve
r = gufunc(a, b, signature=signature, extobj=extobj)
TypeError: No loop matching the specified signature and casting was found for ufunc solve1
To solve a linear matrix equation, use the numpy. linalg. solve() method in Python. The method computes the “exact” solution, x, of the well-determined, i.e., full rank, linear matrix equation ax = b.
NumPy can be used to perform a wide variety of mathematical operations on arrays. It adds powerful data structures to Python that guarantee efficient calculations with arrays and matrices and it supplies an enormous library of high-level mathematical functions that operate on these arrays and matrices.
From the numpy docs: solve is a wrapper for the LAPACK routines dgesv and zgesv, the former being used if a is real-valued, the latter if it is complex-valued. The solution to the system of linear equations is computed using an LU decomposition [R40] with partial pivoting and row interchanges.
Your issue is in your second for
loop.
for fnc in fncList:
res2 = fnc
for i in range(len(varz)):
res2 = res2.subs(varz[i], x0[i])
fx0.append(res2)
When you append to fx0
, you need to ensure that you are appending the same type (float64
) such that NumPy can compute the determinant of your system with LAPACK (see this answer for more info). You are currently appending <class 'sympy.core.numbers.Float'>
- your errror message is telling you that you have an incorrect type signature for usage.
To correct this issue, you can simply append numpy.array
with a dtype
specification for float64
as you did above
for fnc in fncList:
res2 = fnc
for i in range(len(varz)):
res2 = res2.subs(varz[i], x0[i])
fx0.append(numpy.array(res2, dtype='float'))
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With