- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I'm trying to understand how to declare and use in C#: RCI TR Routines for Problem with Bound Constraints.
I have created a simple test console program, and declared just one function (dtrnlspbc_init) but I receive that "there was an error in the input parameters".
It is a Marshalling problem, I suppose, but I don't understand where there is the error.
Is there someone that can help me?
Thankyou
Gianluca
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Check the second and third arguments to dtrnlspbc_init(). I believe that you have them interchanged.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Now it works! thank you
by the way the documentations it is not so clear.
Best Regards
Gianluca
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Which version of the documentation do you mean? The current MKL documentation at https://software.intel.com/en-us/node/471100#867C84A5-D029-4C48-B63B-B68E04CE043D clearly states that the second and third arguments are the number of variables and number of functions whose sum of squares is to be minimized.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Thank you a lot for the reply mecej4.
Hi Gianluca,
You can take the second and third arguments are x length and F(x) length (or m - dimension of function value */.)
actually, the solver required m>>n.Where n is array X's size; m is fvec Array of size m. So you may be change the m = xxx. when go to solve step based on your fvec.
Best Regards,
Ying
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
If I read this page https://software.intel.com/en-us/node/471100#867C84A5-D029-4C48-B63B-B68E04CE043D,
n is the number of variables and, m is the number of functions. In my case I have n=5 and m=1 but this is not allowed because m >> n.
Maybe the parameter are swapped in the dtrnlspbc_init().
Best Regards
Gianluca
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
In that case, you are attempting to obtain five unknowns from a single scalar observation, i.e., you have a standard bound-constrained minimization problem -- instead of the kind of problem that ?TRNLSBC is designed to solve -- a least-squares minimization of an overdetermined problem. For your class of problems, you should use a solver such as those listed for that class in http://plato.asu.edu/sub/nlores.html and http://plato.asu.edu/sub/nlounres.html .
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Thank you for your suggestions.
now it is more clear to me, by the way, I've implemented a test code like the example in the web page (https://software.intel.com/en-us/node/522321).
The objective_function is my_function().
The loop exited correctly but I can't understand where to find the solution!
check row code number 411.
What I miss?
Thank you very much
Gianluca
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
The solution is in xres[], since you used Marshall.Copy to put it there. All that you have to do is to add a formatted output statement such as
Console.WriteLine(string.Format("{0:0.00} {1:0.00} {2:0.00} {3:0.00} {4:0.00}",
xres[0],xres[1],xres[2],xres[3],xres[4]));
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I'm sorry, maybe I was not clear ...
Do you really thought that after the Marshal.Copy(), I couldn't get the array values?
The problem is that the result it is not right!
I mean, these are the initial values. The solutions should be differents.
These should be the correct results:
0 = 197
1 = 351
2 = 185
3 = 1,7
4 = 8,8
We are sure of this, because we got it with another algoritms (Amoeba)
Thank you
Gianluca
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
mecej4 i got the solution!
now it works ....
I forgot to copy the result with Marshal.Copy in my_function proc.
public static void my_function(ref int m, ref int n, [In] IntPtr xp, [Out] IntPtr fp) { double[] x = new double; Marshal.Copy(xp, x, 0, n); double[] f = new double ; Marshal.Copy(fp, f, 0, m); double rho1 = x[0]; double rho2 = x[1]; double rho3 = x[2]; double h1 = x[3]; double h2 = x[4]; //double phi = 0; //int iN = m; // mlMeasures.Count; //Da inserire for (int i = 0; i < m; i++) { f = Math.Pow((mlMeasures.RhoM - RhoCalc(mlMeasures.A, rho1, rho2, rho3, h1, h2)) / mlMeasures.RhoM, 2); } Marshal.Copy(f, 0, fp, m); }
Thank you very much
Gianluca
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page