turn on suggestions

Auto-suggest helps you quickly narrow down your search results by suggesting possible matches as you type.

Showing results for

- NI Discussion Forums
- :
- Most Active Software Boards
- :
- LabWindows/CVI
- :
- Gaussian hypergeometric function 2F1(a,b;c;z)

Topic Options

- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic to the Top
- Bookmark
- Subscribe
- Printer Friendly Page

Highlighted
# Gaussian hypergeometric function 2F1(a,b;c;z)

Options

- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report to a Moderator

09-09-2010 02:29 AM

Hi,

this is a somewhat specific question

I was very happy when I realized that the Advanced Analysis Library of CVI provides the Gaussian or ordinary hypergeometric function _{2}*F*_{1}(*a*,*b*;*c*;*z*), GaussHG.

Unfortunately I have not been able to get the expected results, so I have to assume that I am doing something wrong and I would be grateful for assistance.

Here is the simple code trying to calculate the function

for ( index = 0;

index <= 1000;

index ++ )

{

x [ index ] = -10.0 + index * 0.0108;

y_1 [ index ] = GaussHG ( x [ index ], 0.5, 2.0, 1.5 );

}

The first 833 elements of the y_1 array yield NaNs, the following numbers are oscillating in the range from +0.57 ... +3.29

Here is what I would have expected, using the online function plotter from Wolfram Research:

Help is very much appreciated!

Thanks,

Wolfgang

Solved! Go to Solution.

- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report to a Moderator

09-10-2010 02:21 AM

Hello NI,

I have added some extra data to assist you in calrifying this issue, the data calculated by CVI are depeicted here:

As you can see, the function works reasonably only for not too negative x values. I would appreciate it a lot if this behaviour could be confirmed and fixed as soon as possible - I really need this function and do not want to implement it myself.

Thanks!

- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report to a Moderator

09-13-2010 01:25 AM

Hi,

for easier reproducing the issue I am attaching a simple demo project - would be nice to receive some feedback

- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report to a Moderator

09-14-2010 12:51 AM

Hi Wolfgang,

I think this is a bug.

Thanks a lot for reporting this to us!

Joyce

- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report to a Moderator

09-14-2010 12:56 AM

Hi JoyceXe,

Thank you for addressing this topic. Sorry for being impatient this time but I need this function **urgently**. Is there a chance that you might provide a fix prior to CVI2010?? Otherwise I would need to implement it myself and obviously I'd like to avoid that... So please keep me updated about the progress with this issue. Thanks again,

Wolfgang

Solution

Chosen by topic author Wolfgang

- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report to a Moderator

09-15-2010 04:58 AM - edited 09-15-2010 05:07 AM

Hi Wolfgang,

We have reported this issue as a bug. For a quick workaround, I suggest you take advantage of the following transform:

F(a,b,c,x) = F(a, c - b, c, x/(x-1)) / (1-x)^a, which could map x from (-Inf, 0] to [0,1).

You could revise the original code a bit if performance is not a concern:

for ( index = 0;index <= 1000;index ++ )

{

x [ index ] = -10.0 + index * 0.0108;

if(x[ index ]>=0)

y_1 [ index ] = GaussHG ( x [ index ], 0.5, 2.0, 1.5 );

else //use the transform to map negative x value to [0,1)

y_1[ index ] = GaussHG ( x [ index ] / (x [ index ] - 1.0), 0.5, -0.5, 1.5 ) / pow(1.0-x [ index ], 0.5);

}

for ( index = 0;index <= 1000;index ++ )

{

x [ index ] = -10.0 + index * 0.0108;

if(x[ index ]>=0)

y_1 [ index ] = GaussHG ( x [ index ], 0.5, 2.0, 1.5 );

else //use the transform to map negative x value to [0,1)

y_1[ index ] = GaussHG ( x [ index ] / (x [ index ] - 1.0), 0.5, -0.5, 1.5 ) / pow(1.0-x [ index ], 0.5);

}

Hope this workaround could help. Please feel free to let us know if you have any more questions, thanks!

Arthur

- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report to a Moderator

09-15-2010 05:05 AM

Hi Wolfgang,

We have reported this issue as a bug. For a quick workaround, I suggest you take advantage of the following transform:

F(a,b,c,x) = F(a, c - b, c, x/(x-1)) / (1-x)^a, which could map x from (-Inf, 0] to [0,1).

You could revise the original code a bit if performance is not a concern:

for ( index = 0;index <= 1000;index ++ )

{

x [ index ] = -10.0 + index * 0.0108;

if(x[ index ]>=0)

y_1 [ index ] = GaussHG ( x [ index ], 0.5, 2.0, 1.5 );

else //use the transform to map negative x value to [0,1)

y_1[ index ] = GaussHG ( x [ index ] / (x [ index ] - 1.0), 0.5, -0.5, 1.5 ) / pow(1.0-x [ index ], 0.5);

}

for ( index = 0;index <= 1000;index ++ )

{

x [ index ] = -10.0 + index * 0.0108;

if(x[ index ]>=0)

y_1 [ index ] = GaussHG ( x [ index ], 0.5, 2.0, 1.5 );

else //use the transform to map negative x value to [0,1)

}

Hope this workaround could help. Please feel free to let us know if you have any more questions, thanks!

Arthur

- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report to a Moderator

09-15-2010 06:52 AM

Hi Arthur,

Well, this workaround was a very nice surprise, thanks! Unfortunately, it is not yet fully working as expected, I got the following result:

As you can see, for negative x values the function now works as expected, but for x values from 0... ~0.4 still NaN are the result...

Of course, I could first probe x and then choose one of the two functions, the original or the transform, but this would make things quite slow (still much better than not working).

Thanks again,

Wolfgang

- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report to a Moderator

09-15-2010 10:55 AM

Hi Wolfgang,

I guess you were using the transform when x>=0. However, we only use the transform when x is negative to avoid the bug(because x/(x-1) is positive). So the snippet I pasted actually probe x first and then choose between the original and the transform. I am sorry that will reduce the performance. But it is a quick workaround to get the correct result. We will try to investigate if there is other workaround to get both correctness and performance. Thanks!

Arthur

- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report to a Moderator

09-28-2010 06:42 AM

Hi Arthur,

sorry for the late reply, I just returned from travel.

If I got you right you suggested using the original function for x=0 and positive x values. To me it seems that this approach does not give correct results.

For example, y=GaussHG (0.0, 0.5, 2.0, 1.5) returns y=8.948603854199588E-1, while I would have expected the result to be y=1.0, see here.

Accordingly, the function is not continuous at x=0, see the figure below:

Did I miss something? The above figure has been calculated according to your code snippet.

Thanks,

Wolfgang