Python Forum

Full Version: System of 3 non-linear equations in 3 unknowns (how-to-solve?)
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
This detailed screenshot http://imgbox.com/qFBxoHWd shows how I've solved, in the old past, the system by means of a MatLab function (fsolve), and I'ld like to know if a similar (short) way exists in Python.
Algorithms are listed below:
Output:
% ------ system of 3 non linear equations ---------- % function y=f(x) y=zeros(3,1); rad = pi/180; l1 = 150.210355; s1 = -38.913290; d1 = -11.185833; l2 = 180.308440; s2 = -14.878290; d2 = 14.545555; l3 = 223.495977; s3 = 20.492543; d3 = -8.679444; %--------------------------------------------------- l1 = l1 * rad; s1 = s1 * rad; t1 = tan(d1 * rad); l2 = l2 * rad; s2 = s2 * rad; t2 = tan(d2 * rad); l3 = l3 * rad; s3 = s3 * rad; t3 = tan(d3 * rad); % -------------------------------------------------- y(1)= sin(x(1)+s1)-tan(x(3)+l1)*(cos(x(1)+s1)* sin(x(2))- t1* cos(x(2))); y(2)= sin(x(1)+s2)-tan(x(3)+l2)*(cos(x(1)+s2)* sin(x(2))- t2* cos(x(2))); y(3)= sin(x(1)+s3)-tan(x(3)+l3)*(cos(x(1)+s3)* sin(x(2))- t3* cos(x(2))); endfunction rad = pi/180; [x,fval,info]=fsolve(@f,[10*rad;50*rad;0*rad]) % #3 starting values in radians la= x(1)/rad fi= x(2)/rad eps= x(3)/rad % ---------------- OUTPUT --------------------- x = 2.6180e-001 6.4577e-001 5.6800e-008 fval = 1.0311e-008 4.9066e-008 5.0822e-008

May I have some drifts to reach the goal? Thanks in advance

Edit. For short way I mean the use of an intrinsic function to avoid the classical procedure via an iterative method and related jacobian matrix.
Your code would be almost the same, if you rewrote it in Python.

from math import pi, sin, tan, cos
from scipy.optimize import fsolve

def equations(x):
    rad = pi / 180;
    l1 = 150.210355; s1 = -38.913290; d1 = -11.185833;
    l2 = 180.308440; s2 = -14.878290; d2 =  14.545555;
    l3 = 223.495977; s3 =  20.492543; d3 =  -8.679444;
    l1 = l1 * rad; s1 = s1 * rad; t1 = tan(d1 * rad);
    l2 = l2 * rad; s2 = s2 * rad; t2 = tan(d2 * rad);
    l3 = l3 * rad; s3 = s3 * rad; t3 = tan(d3 * rad);
    return (sin(x[0]+s1)-tan(x[2]+l1)*(cos(x[0]+s1)* sin(x[1])- t1* cos(x[1])), 
            sin(x[0]+s2)-tan(x[2]+l2)*(cos(x[0]+s2)* sin(x[1])- t2* cos(x[1])), 
            sin(x[0]+s3)-tan(x[2]+l3)*(cos(x[0]+s3)* sin(x[1])- t3* cos(x[1]))) 

fsolve(equations, [10 * pi / 180, 50 * pi / 180, 0])
Output:
array([2.61799394e-01, 6.45771810e-01, 1.20245548e-08])
Note: It is not pythonic way to use ; to separate statements, so, it is desirable to rewrite each assignment in a new line.
Wonderful solution, scidam! Just added the output of coords in degrees. Thank you very much, and cheers
# ---------- sist_3eq.py -----------
from math import pi, sin, tan, cos
from scipy.optimize import fsolve
 
def equations(x):
    rad = pi / 180;
    l1 = 150.210355; s1 = -38.913290; d1 = -11.185833;
    l2 = 180.308440; s2 = -14.878290; d2 =  14.545555;
    l3 = 223.495977; s3 =  20.492543; d3 =  -8.679444;
    l1 = l1 * rad; s1 = s1 * rad; t1 = tan(d1 * rad);
    l2 = l2 * rad; s2 = s2 * rad; t2 = tan(d2 * rad);
    l3 = l3 * rad; s3 = s3 * rad; t3 = tan(d3 * rad);
    return (sin(x[0]+s1)-tan(x[2]+l1)*(cos(x[0]+s1)* sin(x[1])- t1* cos(x[1])), 
            sin(x[0]+s2)-tan(x[2]+l2)*(cos(x[0]+s2)* sin(x[1])- t2* cos(x[1])), 
            sin(x[0]+s3)-tan(x[2]+l3)*(cos(x[0]+s3)* sin(x[1])- t3* cos(x[1]))) 
 
print(fsolve(equations, [10 * pi / 180, 50 * pi / 180, 0]))
a= fsolve(equations, [10 * pi / 180, 50 * pi / 180, 0])
print(a[0]*180/pi,a[1]*180/pi) # coords in degrees
# ------- OUTPUT ----------
# C:\Training>python sist_3eq.py
# [2.61799394e-01 6.45771810e-01 1.20245548e-08]
# 15.00000038215297 36.99999924200017
# -------------------------