forum.alglib.net

ALGLIB forum
 It is currently Thu Dec 08, 2022 5:17 am

 All times are UTC

Forum rules

1. This forum can be used for discussion of both ALGLIB-related and general numerical analysis questions
2. This forum is English-only - postings in other languages will be removed.

 Page 1 of 1 [ 5 posts ]
 Print view Previous topic | Next topic
Author Message
 Post subject: Solving nonlinear equationsPosted: Thu Mar 07, 2013 9:08 am

Joined: Thu Mar 07, 2013 8:53 am
Posts: 3
I'm trying to figure out how to solve this set of equations in c#.
My mathematics is very rusty!

Given unknowns:
scale_S, scale_E, offset_S, offset_E
h, f
offset_x, offset_y

And variables:
step_S, step_E
x, y

And general equations:
S = scale_S * step_S + offset_S
E = scale_E * step_E + offset_E
x = offset_x + h * cos(S) - f * cos(S+E)
y = offset_y + h * sin(S) - f * sin(S+E)

Subbing in S and E...
x = offset_x + h * cos( scale_S * step_S + offset_S ) - f * cos( scale_S * step_S + offset_S + scale_E * step_E + offset_E )
y = offset_y + h * sin( scale_S * step_S + offset_S ) - f * sin( scale_S * step_S + offset_S + scale_E * step_E + offset_E )

I'll be setting up a set of calibration points, so I'll have for a given [x,y] the step_S and step_E values.
eg 'when x is 0, y is 0, step_S is 4202 and step_E is 1198'

With 8 unknowns, I'm guessing I'll need 4 calibration points to solve it?

I've read through the documentation for nleq, but I'm completely lost! How do I transform the above equations into something solvable?

Top

 Post subject: Re: Solving nonlinear equationsPosted: Tue Apr 02, 2013 11:33 pm

Joined: Tue Apr 02, 2013 11:16 pm
Posts: 2
My math is not so good but i am not sure you can solve a system of non linear equations where the number of unknowns is more than the equations, in your case 8 unknowns and only 4 equations

Top

 Post subject: Re: Solving nonlinear equationsPosted: Wed Apr 03, 2013 7:42 am

Joined: Thu Mar 07, 2013 8:53 am
Posts: 3
mamu wrote:
My math is not so good but i am not sure you can solve a system of non linear equations where the number of unknowns is more than the equations, in your case 8 unknowns and only 4 equations

Each calibration point has an x and a y component, so it's 8 unknowns and 4 x 2 = 8 equations.

In any case, I had no idea how to do it in alglib, so I ended up cheating; just measuring all but two unknowns, and doing a manual calibration step.

Top

 Post subject: Re: Solving nonlinear equationsPosted: Fri Apr 05, 2013 3:52 pm

Joined: Tue Apr 02, 2013 11:16 pm
Posts: 2
Here is an example of an unconstrained nonlinear system of equations solved with nleq and minlm (dv) using C# and VB.net.

f0(x0,x1,x2,x3) = -x0^2 -x1^2 -x2^2 +x3 = 0
f1(x0,x1,x2,x3) = x0^2 +x1^2 +x2^2 +x3 -1 = 0
f2(x0,x1,x2,x3) = x1 - x2 = 0
f3(x0,x1,x2,x3) = x2 - x3 = 0

1. nleq requires you to provide the partial derivatives for your system of equations so that the jacobian matrix can formed.

2. minlm_d_v does not require the you to provide the partial derivatives.

Using nleq with c#
Code:
using System;
using System.Text;

//
// using nleq with c#
//

namespace Project1
{
class Program
{
public static void function1_func(double[] x, ref double fi, object obj)
{
//
// this callback calculates the merit function
// f(x)=F[0]^2(x)+...+F[M-1]^2(x)
// using
// f0(x0,x1,x2,x3) = -x0^2 -x1^2 -x2^2 +x3 = 0
// f1(x0,x1,x2,x3) =  x0^2 +x1^2 +x2^2 +x3 -1 = 0
// f2(x0,x1,x2,x3) =  x1 - x2 = 0
// f3(x0,x1,x2,x3) =  x2 - x3 = 0

double f0 = -(x[0] * x[0]) - (x[1] * x[1]) - (x[2] * x[2]) + x[3];
double f1 = (x[0] * x[0]) + (x[1] * x[1]) + (x[2] * x[2]) + (x[3] * x[3]) - 1.0;
double f2 = x[0] - x[1];
double f3 = x[1] - x[2];

fi = Math.Pow(f0, 2) + Math.Pow(f1, 2) + Math.Pow(f2, 2) + Math.Pow(f3, 2);  // the merit function
}

public static void function1_jac(double[] x, double[] fi, double[,] jac, object obj)
{
//
// this callback calculates the two-dimensional matrix of partial derivatives jac()
// using
// f0(x0,x1,x2,x3) = -x0^2 -x1^2 -x2^2 +x3 = 0
// f1(x0,x1,x2,x3) =  x0^2 +x1^2 +x2^2 +x3 -1 = 0
// f2(x0,x1,x2,x3) =  x1 - x2 = 0
// f3(x0,x1,x2,x3) =  x2 - x3 = 0

fi[0] = -(x[0] * x[0]) - (x[1] * x[1]) - (x[2] * x[2]) + x[3];
fi[1] = (x[0] * x[0]) + (x[1] * x[1]) + (x[2] * x[2]) + (x[3] * x[3]) - 1.0;
fi[2] = x[0] - x[1];
fi[3] = x[1] - x[2];

// the analytic jacobian for this nonlinear system
// is obtained by partially differentiating each equation by x0,x1,x2,x3

jac[0, 0] = (-2.0) * x[0];      // partial differentiation of f0 by xo
jac[0, 1] = (-2.0) * x[1];      // partial differentiation of f0 by x1
jac[0, 2] = (-2.0) * x[2];      // partial differentiation of f0 by x2
jac[0, 3] = 1.0;                // partial differentiation of f0 by x3
jac[1, 0] = 2.0 * x[0];         // partial differentiation of f1 by xo
jac[1, 1] = 2.0 * x[1];         // partial differentiation of f1 by x1
jac[1, 2] = 2.0 * x[2];         // partial differentiation of f1 by x2
jac[1, 3] = 2.0 * x[3];         // partial differentiation of f1 by x3
jac[2, 0] = 1.0;                // partial differentiation of f2 by xo
jac[2, 1] = -1.0;               // partial differentiation of f2 by x1
jac[2, 2] = 0.0;                // partial differentiation of f2 by x2
jac[2, 3] = 0.0;                // partial differentiation of f2 by x3
jac[3, 0] = 0.0;                // partial differentiation of f3 by x0
jac[3, 1] = 1.0;                // partial differentiation of f3 by x1
jac[3, 2] = -1.0;               // partial differentiation of f3 by x2
jac[3, 3] = 0.0;                // partial differentiation of f3 by x3

}

public static int Main(string[] args)
{
int n = 4;  // number of x(i)
int m = 4;  // number of f(i) equations
double[] x = { 1, 1, 1, 1 }; //initial values of x0,x1,x2,x3 respectively

double epsf = 0.000001;
int maxits = 0; // unlimited iterations
double stpmax = 0.0;

alglib.nleqstate state;
alglib.nleqreport rep;

alglib.nleqcreatelm(n, m, x, out state);
alglib.nleqsetcond(state, epsf, maxits);
alglib.nleqsetstpmax(state, stpmax);

alglib.nleqsetxrep(state, false);
alglib.nleqsolve(state, function1_func, function1_jac, null, null);
alglib.nleqresults(state, out x, out rep);

System.Console.WriteLine("{0}", rep.terminationtype);       // EXPECTED: 1
System.Console.WriteLine("{0}", alglib.ap.format(x, 5));    // EXPECTED: [0.45388,0.45388,0.45388,0.61803]
return 0;
}

}
}

Using minlm_d_v with c#
Code:
using System;
using System.Text;

//
//using minlm_d_v with c#
//

namespace Project2
{
class Program
{
public static void function1_fvec(double[] x, double[] fi, object obj)
{
// this callback calculates the two-dimensional matrix of partial derivatives jac()
// using
// f0(x0,x1,x2,x3) = -x0^2 -x1^2 -x2^2 +x3 = 0
// f1(x0,x1,x2,x3) =  x0^2 +x1^2 +x2^2 +x3 -1 = 0
// f2(x0,x1,x2,x3) =  x1 - x2 = 0
// f3(x0,x1,x2,x3) =  x2 - x3 = 0

fi[0] = -(x[0] * x[0]) - (x[1] * x[1]) - (x[2] * x[2]) + x[3];
fi[1] = (x[0] * x[0]) + (x[1] * x[1]) + (x[2] * x[2]) + (x[3] * x[3]) - 1.0;
fi[2] = x[0] - x[1];
fi[3] = x[1] - x[2];
}

public static int Main(string[] args)
{

int m = 4;  // number of f(i) equations
double[] x = { 1, 1, 1, 1 }; //initial values of x0,x1,x2,x3 respectively
double diffstep = 0.0001;

double epsg = 0.000001;
double epsf = 0;
double epsx = 0;
int maxits = 0; // unlimited iterations

alglib.minlmstate state;
alglib.minlmreport rep;

alglib.minlmcreatev(m, x, diffstep, out state);
alglib.minlmsetcond(state, epsg, epsf, epsx, maxits);
alglib.minlmoptimize(state, function1_fvec, null, null);
alglib.minlmresults(state, out x, out rep);

System.Console.WriteLine("{0}", rep.terminationtype);       // EXPECTED: 4
System.Console.WriteLine("{0}", alglib.ap.format(x, 5));    // EXPECTED: [0.45388,0.45388,0.45388,0.61803]
return 0;

}

}
}

Using nleq and vb.net
Code:
Module MainModule
Public Sub func(ByVal X As Double(), ByRef fi As Double, ByVal obj As Object)

'
'using nleq and vb.net
'

' this callback calculates the merit function
' f(x)=F[0]^2(x)+...+F[M-1]^2(x)
' using
' f0(x0,x1,x2,x3) = -x0^2 -x1^2 -x2^2 +x3 = 0
' f1(x0,x1,x2,x3) =  x0^2 +x1^2 +x2^2 +x3 -1 = 0
' f2(x0,x1,x2,x3) =  x1 - x2 = 0
' f3(x0,x1,x2,x3) =  x2 - x3 = 0

Dim f0 As Double
Dim f1 As Double
Dim f2 As Double
Dim f3 As Double

f0 = -X(0) ^ 2 - X(1) ^ 2 - X(2) ^ 2 + X(3)
f1 = X(0) ^ 2 + X(1) ^ 2 + X(2) ^ 2 + X(3) ^ 2 - 1.0
f2 = X(0) - X(1)
f3 = X(1) - X(2)

fi = f0 ^ 2 + f1 ^ 2 + f2 ^ 2 + f3 ^ 2 ' the merit function

End Sub
Public Sub function1_jac(ByVal x As Double(), ByVal fx As Double(), ByVal jac As Double(,), ByVal obj As Object)
'
' this callback calculates the two-dimensional matrix of partial derivatives jac()
' using
' f0(x0,x1,x2,x3) = -x0^2 -x1^2 -x2^2 +x3 = 0
' f1(x0,x1,x2,x3) =  x0^2 +x1^2 +x2^2 +x3 -1 = 0
' f2(x0,x1,x2,x3) =  x1 - x2 = 0
' f3(x0,x1,x2,x3) =  x2 - x3 = 0

fx(0) = -x(0) ^ 2 - x(1) ^ 2 - x(2) ^ 2 + x(3)
fx(1) = x(0) ^ 2 + x(1) ^ 2 + x(2) ^ 2 + x(3) ^ 2 - 1.0
fx(2) = x(0) - x(1)
fx(3) = x(1) - x(2)

' the analytic jacobian for this nonlinear system
' is obtained by partially differentiating each equation by x0,x1,x2,x3

jac(0, 0) = -2.0 * x(0)         ' partial differentiation of f0 by xo
jac(0, 1) = -2.0 * x(1)         ' partial differentiation of f0 by x1
jac(0, 2) = -2.0 * x(2)         ' partial differentiation of f0 by x2
jac(0, 3) = 1.0                 ' partial differentiation of f0 by x3
jac(1, 0) = 2.0 * x(0)          ' partial differentiation of f1 by xo
jac(1, 1) = 2.0 * x(1)          ' partial differentiation of f1 by x1
jac(1, 2) = 2.0 * x(2)          ' partial differentiation of f1 by x2
jac(1, 3) = 2.0 * x(3)          ' partial differentiation of f1 by x3
jac(2, 0) = 1.0                 ' partial differentiation of f2 by xo
jac(2, 1) = -1.0                ' partial differentiation of f2 by x1
jac(2, 2) = 0.0                 ' partial differentiation of f2 by x2
jac(2, 3) = 0.0                 ' partial differentiation of f2 by x3
jac(3, 0) = 0.0                 ' partial differentiation of f3 by x0
jac(3, 1) = 1.0                 ' partial differentiation of f3 by x1
jac(3, 2) = -1.0                ' partial differentiation of f3 by x2
jac(3, 3) = 0.0                 ' partial differentiation of f3 by x3

End Sub
Public Sub Main()

Dim n As Integer = 4 ' number of x(i)
Dim m As Integer = 4 ' number of f(i) equations
Dim x() As Double = {1, 1, 1, 1}    'initial values of x0,x1,x2,x3 respectively
Dim state As nleqstate = New XAlglib.nleqstate()
Dim rep As nleqreport = New XAlglib.nleqreport()

Dim epsf As Double = 0.000001
Dim maxits As Integer = 0   'unlimited iterations
Dim stpmax As Double = 0.0

XAlglib.nleqcreatelm(n, m, x, state)
XAlglib.nleqsetcond(state, epsf, maxits)
XAlglib.nleqsetstpmax(state, stpmax)
XAlglib.nleqsetxrep(state, False)

XAlglib.nleqresults(state, x, rep)

System.Console.WriteLine("{0}", rep.terminationtype)    'EXPECTED: 1
System.Console.WriteLine("{0}", alglib.ap.format(x, 5)) 'EXPECTED: [0.45388,0.45388,0.45388,0.61803]
End Sub

End Module

Using minlm (dv) with vb.net
Code:
Module Module1
Public Sub function1_fvec(ByVal x As Double(), ByVal fi As Double(), ByVal obj As Object)

'
'using minlm (dv) with vb.net
'

'
' this callback calculates
' f0(x0,x1,x2,x3) = -x0^2 -x1^2 -x2^2 +x3 = 0
' f1(x0,x1,x2,x3) =  x0^2 +x1^2 +x2^2 +x3 -1 = 0
' f2(x0,x1,x2,x3) =  x1 - x2 = 0
' f3(x0,x1,x2,x3) =  x2 - x3 = 0

fi(0) = -x(0) ^ 2 - x(1) ^ 2 - x(2) ^ 2 + x(3)
fi(1) = x(0) ^ 2 + x(1) ^ 2 + x(2) ^ 2 + x(3) ^ 2 - 1.0
fi(2) = x(0) - x(1)
fi(3) = x(1) - x(2)
End Sub

Sub Main()
Dim m As Integer = 4 ' number of Equations
Dim diffstep As Double = 0.0001
Dim x() As Double = New Double() {1, 1, 1, 1} ' initial values of x0, x1, x2, x3 respectively

Dim epsg As Double = 0.000001
Dim epsf As Double = 0
Dim epsx As Double = 0
Dim maxits As Integer = 0   'unlimited iterations

Dim state As minlmstate = New XAlglib.minlmstate()
Dim rep As minlmreport = New XAlglib.minlmreport()

XAlglib.minlmcreatev(m, x, diffstep, state)
XAlglib.minlmsetcond(state, epsg, epsf, epsx, maxits)
XAlglib.minlmresults(state, x, rep)

System.Console.WriteLine("{0}", rep.terminationtype)    'EXPECTED: 4
System.Console.WriteLine("{0}", alglib.ap.format(x, 5)) 'EXPECTED: [0.45388,0.45388,0.45388,0.61803]
Environment.Exit(0)
End Sub

End Module

Top

 Post subject: Re: Solving nonlinear equationsPosted: Tue Apr 09, 2013 12:08 am

Joined: Thu Mar 07, 2013 8:53 am
Posts: 3
Thanks mamu,

That makes sense! :-)

Top

 Display posts from previous: All posts1 day7 days2 weeks1 month3 months6 months1 year Sort by AuthorPost timeSubject AscendingDescending
 Page 1 of 1 [ 5 posts ]

 All times are UTC

Who is online

Users browsing this forum: No registered users and 1 guest

 You cannot post new topics in this forumYou cannot reply to topics in this forumYou cannot edit your posts in this forumYou cannot delete your posts in this forumYou cannot post attachments in this forum

Search for: