forum.alglib.net

ALGLIB forum
It is currently Sun Nov 24, 2024 4:37 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.



Post new topic Reply to topic  [ 5 posts ] 
Author Message
 Post subject: Solving nonlinear equations
PostPosted: Thu Mar 07, 2013 9:08 am 
Offline

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
 Profile  
 
 Post subject: Re: Solving nonlinear equations
PostPosted: Tue Apr 02, 2013 11:33 pm 
Offline

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
 Profile  
 
 Post subject: Re: Solving nonlinear equations
PostPosted: Wed Apr 03, 2013 7:42 am 
Offline

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
 Profile  
 
 Post subject: Re: Solving nonlinear equations
PostPosted: Fri Apr 05, 2013 3:52 pm 
Offline

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]
            System.Console.ReadLine();
            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]
            System.Console.ReadLine();
            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.nleqsolve(state, AddressOf func, AddressOf function1_jac, Nothing, Nothing)
        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]
        System.Console.ReadLine()
    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.minlmoptimize(state, AddressOf function1_fvec, Nothing, Nothing)
        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]
        System.Console.ReadLine()
        Environment.Exit(0)
    End Sub

End Module



Top
 Profile  
 
 Post subject: Re: Solving nonlinear equations
PostPosted: Tue Apr 09, 2013 12:08 am 
Offline

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

That makes sense! :-)


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 5 posts ] 

All times are UTC


Who is online

Users browsing this forum: No registered users and 4 guests


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

Search for:
Jump to:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group