Author 
Topic 

robuiuc
USA
4 Posts 
Posted  06/03/2012 : 9:04:43 PM

Origin Ver. and Service Release (Select Help>About Origin): 8.6.0 64bit, b70 Operating System: win7
I have a relatively simple problem, and I haven't been able to find (what I'm assuming should be) concise code to solve it.
I have a sinusoidal data set and I'm trying to find the first xintercept, and then integrate the data from 0 to that value. The code I've attempted is below. I tried to specify a certain data range, but I always get the 3rd (last) xintercept. Also, the integrate command (when it works), integrates the entire data set. What modifications do I need to make to the code? If it simplifies things, the xintercept for all data sets is always in between x = 0.51. Thanks much.
range r1 = col(1)[0:2250]; //attempting to limit data to 1st x intercept range r2 = col(2)[0:2250]; r2(0); r1(0, r2)=; s1 = r1(0, r2); //attempting to set s1 = x intercept int ix1=xindex(0,%c); int ix2=xindex(s1,%c); //integrate from 0s1? range rr=(%c)[$(ix1): $(ix2)]; integ1 rr; integ1.=; 

Kathy_Wang
China
127 Posts 
Posted  06/04/2012 : 05:51:17 AM

Hi The problem with your script is mostly that you used invalid range notation, there are three parts in the script you will need to modify for this reason.
1. When you define range r1 and r2, the row index starts from 1 rather than 0;
2. When you define integrals ix1 and ix2, instead of "%c", you should use "r2" as the range, also it is recommended that you introduce the control variable 2 to find values both from left and right, otherwise the script won稚 work when you starting value is not 0;
3. When you define range rr for integration, instead of using (%c)[$(ix1): $(ix2)]; use 1[$(ix1)]:2[$(ix2)]; here I assumed your XY range is column 1 and 2, if not, you will need to modify the script accordingly.
In addition, an equal mark is missing after "r2(0)".
Here I helped to modify the script as following, which you might try:
range r1 = col(1)[1:2250]; //attempting to limit data to 1st x intercept
range r2 = col(2)[1:2250];
r2(0)=;
r1(0, r2)=;
s1 = r1(0, r2);
int ix1=xindex(0,r2,2);
int ix2=xindex(s1,r2,2); //integrate from 0s1
range rr=1[$(ix1)]:2[$(ix2)];
integ1 rr;
integ1.=;
Hope this information helps!
Kathy Originlab 


robuiuc
USA
4 Posts 
Posted  06/04/2012 : 08:01:18 AM

Thank you very much for your quick response. This is a little closer, but I still have two issues: 1. The first two lines of the code do not appear to be working; the range is not restricted to the specified range (first 2250 rows) and it is still finding the last (third) xintercept.
2. The integration is indeed calculating from the 'correct' data range, but it is not using the right xvalues. For my data, x=0 corresponds to row 1000. In the in results log, the integration does not start at 0 (x1 =0), but rather x1 =1000. This is resulting in erroneous integrated areas (vs. when I manually use the GUI). Any suggestions? Thanks. 


Laurie
USA
404 Posts 
Posted  06/04/2012 : 10:13:11 AM

Your script can be simplified to the following 4 lines:
range r1 = 1; range r2 = 2; double ix2 = r1(0, r2); integ1 (r1,r2)[x0:$(ix2)];
Let me know if this works for you.
OriginLab Technical Support 


robuiuc
USA
4 Posts 
Posted  06/04/2012 : 10:31:28 AM

Thanks once again. The integration magnitude is now correct. However, the signal is sinusoidal there are three xintercepts, and this is integrating to the last one. Using the code above, is there a way to either: restrict the input data or somehow specify the first intercept (which always occurs somewhere between x = 0.51? 


Laurie
USA
404 Posts 
Posted  06/04/2012 : 11:16:14 AM

We can simplify it further, to just three lines:
range rxy = (2,1); double ix2 = rxy(0); integ1 (r1,r2)[x0:$(ix2)];
It doesn't make sense to me that the second line of code above, for you, is finding the last intercept; it should find the first instance of 0.
Please paste your new code here so I can take alook.
Thank you.
OriginLab Technical Support 


robuiuc
USA
4 Posts 
Posted  06/04/2012 : 2:39:30 PM

I emailed the raw data to Support with reference to this thread. For the time being I am simply using the code provided above. Once I hear back, I will post the response here. I'm not quite sure why restricting the data to the first half cycle does not work. 


Laurie
USA
404 Posts 
Posted  06/05/2012 : 5:59:21 PM

My apologies....
I think using an xy range for interpolation only works when the X dataset is monotonically increasing or decreasing.
We will email you too...
OriginLab Technical Support 


couturier
France
106 Posts 
Posted  06/07/2012 : 3:14:26 PM

quote: range r1 = 1; range r2 = 2; double ix2 = r1(0, r2);
This is the first time I see a notation such as last line and I can't understand how it works.
Can anyone explain ? 


Kathy_Wang
China
127 Posts 
Posted  06/21/2012 : 01:48:38 AM

quote: Originally posted by couturier
quote: range r1 = 1; range r2 = 2; double ix2 = r1(0, r2);
This is the first time I see a notation such as last line and I can't understand how it works.
Can anyone explain ?
Hi, the notation r1(0) is used as interpolation through range notation.
Such expression as r1(0,r2) returns to the interpolated X value when the Y value in r2 is equal to 0, and the data set in r1 is used as the X value in this case.
Kathy Originlab 
Edited by  Kathy_Wang on 06/21/2012 04:47:49 AM 



Topic 


