Solving N simultaneous non-linear equations with N unknowns

Post Reply
Henko
Posts: 814
Joined: Tue Apr 09, 2013 12:23 pm
My devices: iPhone,iPad
Windows
Location: Groningen, Netherlands
Flag: Netherlands

Solving N simultaneous non-linear equations with N unknowns

Post by Henko »

This program will find a solution for a set of arbitrary equations, but only if one or more solutions exist. Equations like y=f(x1,x2,....,xn) must be rewitten as f(x1,x2,....,xn) - y = 0 and the left part of this equation be entered in the program.
As an example, the common intersection point of 3 spheres in 3-dim space is calculated.
The 3 spheres each have an equal radius of 7, and their midpoints (x,y,z) are (3,3,3), (1,-2,-1) and (-1,2,-2) respectively. These spheres have a common intersection point. If you enlarge the radius of one of the spheres such that it encompasses the other two, the result "no solution" will be given.
The problem-related data is in yellow, the rest of the program remains unchanged for any problem.

Code: Select all

option base 1
dim jac(9,9),dx(9),eps(9),var(9)
max_iter=10 ! max_err=.01
'y'  ' # of variables and starting values for them
n=3 ! read var(1),var(2),var(3) ! data 0,0,0
''
for iter=1 to max_iter
  for i=1 to n
    eps(i)=func(i,var)  '  deviations from zero to be corrected
    for j=1 to n ! jac(i,j)=deriv(i,j,var) ! next j  ' Jacobian matrix
    next i
  lin_eqn(n,jac,dx,eps) ! err=0   '  corrections to the variables
  for i=1 to n ! var(i)-=dx(i) ! err+=dx(i)^2 ! next i  ' apply them
  if err<max_err then break
  next iter
if err>max_err then ! print "no solution"
  else ! for i=1 to n ! print "var"&i&" : ";var(i) ! next i
  end if
end

def func(i,x())
'y'
on i goto sphere1,sphere2,sphere3
sphere1: return (x(1)-3)^2+(x(2)-3)^2+(x(3)-3)^2-7^2
sphere2: return (x(1)-1)^2+(x(2)+2)^2+(x(3)+1)^2-7^2
sphere3: return (x(1)+1)^2+(x(2)-2)^2+(x(3)+2)^2-7^2
''
end def

def deriv(i,j,x())  ' partial derivate of function i w.r.t. variable j
fx=func(i,x)
delta=.001*x(j) ! delta=max(abs(delta),.001)
x(j)+=delta ! fxplus=func(i,x) ! x(j)-=delta
return (fxplus-fx)/delta
end def

def lin_eqn(nvar,a(,),x(),b())  ' solve nvar lineair equations
for i=1 to nvar-1
  for j=i+1 to nvar
    fac=a(j,i)/a(i,i) ! b(j)=b(j)-fac*b(i) 
    for k=i+1 to nvar ! a(j,k)=a(j,k)-fac*a(i,k) ! next k
    next j
  next i
x(nvar)=b(nvar)/a(nvar,nvar)
for i=nvar-1 to 1 step -1 ! x(i)=b(i)
  for j=i+1 to nvar ! x(i)=x(i)-a(i,j)*x(j) ! next j
  x(i)=x(i)/a(i,i)
  next i
return
end def

Post Reply