MathGroup Archive 2001

[Date Index] [Thread Index] [Author Index]

Search the Archive

Help With MathLink

  • To: mathgroup at smc.vnet.net
  • Subject: [mg28951] Help With MathLink
  • From: "Ersek, Ted R" <ErsekTR at navair.navy.mil>
  • Date: Mon, 21 May 2001 00:43:38 -0400 (EDT)
  • Sender: owner-wri-mathgroup at wolfram.com

You may remember the RootSearch program I discussed several weeks ago. So
far I only had a little time to work on it .... I want to do most of the
work in C and I am having trouble with MathLink.  I will make the program
more elegant once I get it working.

In the Mathematica I define:

In[1]:=
    f = Sin; (* Eventually Rootsearch will automatically define f in a
privat context. *)
    SampleFunction[x_]:= With[ {y=N[f[x]] },
      If[ MachineNumberQ[y], {x, y, 1.0}, {x, 99.0, 0.0} ]
    ]

(*************************)
Then I get the following results:

In[2]:= Install[ "rootsearch" ]

Out[2]=
    LinkObject[.\rootsearch.exe,2,2]


In[3]:=  RootSearch[ Sin[x], {x, 2.0, 3.0}]

Out[3]=
   {{0. , 0. , 0. }, {0. , 0. , 0. }}

I expected the following output instead.
   {{2., 0.909297, 1. },{3., 0.14112, 1. }}


Please help me get it working.  I can email you the related files if it
helps. 
    Thank you in advance,
    Ted Ersek
----------------------------------

My MathLink templete is:
/* ----------------------- */
:Begin:
:Function:       root_search
:Pattern:        RootSearch[func_,{x_Symbol,x0_Real,x1_Real}]

:Arguments:      { x0, x1}
:ArgumentTypes:  { Real, Real }
:ReturnType:     Manual
:End:
/* ------------------------- */

My source code is:

/* ------------------------- */

#include "mathlink.h"
#include "stdlib.h"
#include "stdio.h"
 
void sample_function( double x, double *result);

extern void root_search(double x0, double x1);

void root_search(double x0, double x1)
{
  int total_samples=0;
  int dimensions[2];
  char *heads[2];
  long depth=2;
  double *value_array;
  value_array=(double*)calloc(24,sizeof(double));

  sample_function(x0,value_array);
  total_samples++;

  sample_function(x1,value_array+3);
  total_samples++;

  dimensions[0]=2;
  dimensions[1]=3;
  heads[0]=heads[1]="List"; 
  MLPutRealArray(stdlink,value_array,dimensions,heads,depth);
  return;
}

 
void sample_function( double x, double *result )
{
  long three=3;
  
  MLPutFunction(stdlink,"EvaluatePacket",1);
    MLPutFunction(stdlink,"SampleFunction",1);
      MLPutDouble(stdlink,x);
  MLEndPacket(stdlink);
  MLNextPacket(stdlink);
  
  MLGetRealList(stdlink,&result,&three);
  MLDisownRealList(stdlink,result,three);
  return;
}




  • Prev by Date: RE: 3d Graphics problem
  • Next by Date: Re: Re: Re: Creating graph with only a few data points
  • Previous by thread: heart rendering
  • Next by thread: Re: Help With MathLink