adriaanrijllart Posted July 27, 2007 Report Share Posted July 27, 2007 Hi LAVA people, Does anybody know a standard LabVIEW vi or has anyone developed a vi to calculate dY/dt (both are double arrays) where dt is a variable step size (but monotonic) and not a constant as usual? Thanks! Adriaan Rijllart Quote Link to comment
Dirk J. Posted July 27, 2007 Report Share Posted July 27, 2007 hmmm, this is such a basic problem that I really wonder why you don't try it yourself. the simplest method would be dY/dt (t(i)) = [y(t(i))-y(t(i+1))]/[(t)i - t(i+1)] for more complicated algorithms, google is your friend. QUOTE(adriaanrijllart @ Jul 26 2007, 03:47 PM) Hi LAVA people,Does anybody know a standard LabVIEW vi or has anyone developed a vi to calculate dY/dt (both are double arrays) where dt is a variable step size (but monotonic) and not a constant as usual? Thanks! Adriaan Rijllart Quote Link to comment
adriaanrijllart Posted July 27, 2007 Author Report Share Posted July 27, 2007 Sure I can use the formula node. It was just that I wondered ... knowing there are >500 built-in mathematical functions, that there might be something I overlooked. Thanks for taking away the doubt that I need to use the formula. Adriaan. Quote Link to comment
BobHamburger Posted July 27, 2007 Report Share Posted July 27, 2007 A quick thought: you could resample your data so that you end up with a new, constant dt. Then you could use any of the standard analysis VI's. Quote Link to comment
Dirk J. Posted July 27, 2007 Report Share Posted July 27, 2007 QUOTE Sure I can use the formula node. Why would you? I guess you have a background in text-programming because you want to use a formula node that fast... You have two arrays of t and y(t), why not use a simple for-loop in labview? QUOTE(BobHamburger @ Jul 26 2007, 06:34 PM) A quick thought: you could resample your data so that you end up with a new, constant dt. Then you could use any of the standard analysis VI's. that would probably require more LV knowledge than solving the problem in G in the first place Quote Link to comment
Neville D Posted July 27, 2007 Report Share Posted July 27, 2007 QUOTE(Dirk J. @ Jul 26 2007, 09:47 AM) Why would you? I guess you have a background in text-programming because you want to use a formula node that fast...You have two arrays of t and y(t), why not use a simple for-loop in labview? that would probably require more LV knowledge than solving the problem in G in the first place Going off-track for a bit, there is a very useful re-sample VI buried somewhere in LV (I found it by breaking apart an express VI: Align & Resample Express VI), which is extremely easy to use and works great.. it probably might work with the variable dt as well. But, I wouldn't recommend using it in this particular case. Neville. Quote Link to comment
adriaanrijllart Posted July 28, 2007 Author Report Share Posted July 28, 2007 Thanks for the tips! I'm not really a line programmer ... that's why I'm looking for a vi. It's just that I thought there must be something out there, ready for me. It was the suggestion that made me think of it. I've considered resampling, but that would mean putting the whole signal on the same dt. This increases the number of points quite a lot, because there's a slow part and a fast part. And I've been finger pointed already for using many MBs ... and I had promised a very efficient program, "cute and clean". So I'm happy with Dirk's suggestion of the For loop. Thanks again to all who replied! It was very useful. Adriaan. Quote Link to comment
adriaanrijllart Posted August 9, 2007 Author Report Share Posted August 9, 2007 Hi all, found a way to do the calculation without loop. Only array functions. Cheers, Adriaan. Quote Link to comment
Grampa_of_Oliva_n_Eden Posted August 9, 2007 Report Share Posted August 9, 2007 QUOTE(adriaanrijllart @ Aug 8 2007, 09:27 AM) Hi all,found a way to do the calculation without loop. Only array functions. Cheers, Adriaan. Should the contant be "1"or "0" ? Ben Quote Link to comment
Dirk J. Posted August 9, 2007 Report Share Posted August 9, 2007 QUOTE(Ben @ Aug 8 2007, 03:56 PM) Should the contant be "1"or "0" ?Ben 1. The first (0-index) element of y and t arrays is deleted using the Array Subset function. this trick works because LV allows you to subtract arrays of different sizes. drawback here is that ArraySize(Derivatives) = ArraySize(Y) - 1 Quote Link to comment
Grampa_of_Oliva_n_Eden Posted August 9, 2007 Report Share Posted August 9, 2007 QUOTE(Dirk J. @ Aug 8 2007, 10:20 AM) 1.The first (0-index) element of y and t arrays is deleted using the Array Subset function. this trick works because LV allows you to subtract arrays of different sizes. drawback here is that ArraySize(Derivatives) = ArraySize(Y) - 1 Thank you Dirk! I stand corrected. Ben Quote Link to comment
Dirk J. Posted August 9, 2007 Report Share Posted August 9, 2007 QUOTE(Ben @ Aug 8 2007, 04:34 PM) Thank you Dirk!I stand corrected. Ben I was myopically staring at the screenshot for quite some time to figure out that it was 'array subset'. all these icons look alike Quote Link to comment
eaolson Posted August 9, 2007 Report Share Posted August 9, 2007 QUOTE(adriaanrijllart @ Aug 8 2007, 08:27 AM) found a way to do the calculation without loop. Only array functions. Be aware that this introduces a bias into your data, namely that you're getting the derivative from the left side of the function. Basically lim(dy/dt) as t -> t_i+. This will only be strictly true if the second derivative of your function is zero. It maybe a small enough effect that you don't care, though. Quote Link to comment
Neville D Posted August 11, 2007 Report Share Posted August 11, 2007 QUOTE(adriaanrijllart @ Aug 8 2007, 06:27 AM) Hi all,found a way to do the calculation without loop. Only array functions. Cheers, Adriaan. Hi Adrian, Though doing the calculation without a loop is possible, the code will now make two extra copies of the arrays Y and t possibly even a third copy for the dY/dt output; this may not be a big issue for "small" arrays, but with very large arrays this could affect performance due to memory manager calls. I would suggest using the loop approach to limit the memory issue (even if it is not a concern presently). This would prevent possible future performance issues. Open your VI and select: Tools>>Profile>>Highlight Buffer allocations to see what I'm talking about. Neville. Quote Link to comment
adriaanrijllart Posted August 15, 2007 Author Report Share Posted August 15, 2007 Hi Guys, Thanks for all reactions. They are all true. Neville: It does create a copy of the data, but that's the price to pay for keeping the code simple and fast. For very big arrays I will reconsider the loop. eaolson: There is a bias to the left side of the function, but also using a loop this will remain. I don't see how to avoid it. I will always get 1 point less in the final array, as I have to use two input elements to produce on output. But I'm open for suggestions. Ben: Yes the constant is 1. This is the trick to calculate Y(i+1)-Y(i). One additional point I thought of is to add a criterion of filtering the signal if it contains too much noise. I thought someone would make the remark, but so far no one seems to have had this problem. Thanks all. Adriaan. Quote Link to comment
Neville D Posted August 15, 2007 Report Share Posted August 15, 2007 QUOTE(adriaanrijllart @ Aug 14 2007, 10:46 AM) One additional point I thought of is to add a criterion of filtering the signal if it contains too much noise. I thought someone would make the remark, but so far no one seems to have had this problem. The derivative of a signal is going to make the noise problem much worse. Discontinuities in your point data will cause spikes in the derivative. That is why its never a good idea to use it in practice. This is also the reason why increasing the derivative gain in a PID loop can cause the loop to go unstable. Better approach: fit a polynomial curve to the data and take its analytical derivative which should be fairly smooth and continuous. Neville. Quote Link to comment
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.