switching functions for continuous time

3 ビュー (過去 30 日間)
A
A 2011 年 5 月 25 日
I am plotting a function for say:
t = 0:0.1:1 %seconds
I want to use one function for:
t < 0.2
One for:
t >= 0.2 & t <= 0.0.8
And then one for:
t >0.8
I can't get it to work using the conventions I have stated aboce

採用された回答

Walter Roberson
Walter Roberson 2011 年 5 月 25 日
y = zeros(size(t));
idx = t<0.2;
y(idx) = f1(t(idx));
idx = t>=0.2 & t<=0.08
y(idx) = f2(t(idx));
idx = t>0.8;
y(idx) = f3(t(idx));

その他の回答 (8 件)

A
A 2011 年 6 月 6 日
The problem is I want to plot them all on one graph.
So I need to piece together the part from 0-0.2, 0.2-0.8, and 0.8-1.10 seconds.
EDIT - also do I just replace f1, f2, f3 with my function?
  3 件のコメント
A
A 2011 年 6 月 7 日
so how would i plot it then?
Walter Roberson
Walter Roberson 2011 年 6 月 7 日
plot(t,y)

サインインしてコメントする。


A
A 2011 年 6 月 14 日
How can I apply the same concept, but switch functions based on the value of the function?
Say y is a step function going from 0 to 100.
I want to switch from one function to another at y = 80, instead of using time.
  2 件のコメント
Walter Roberson
Walter Roberson 2011 年 6 月 14 日
"for" loop and an if/elseif structure if it is expensive to compute the values.
If computing the values is relatively cheap,
y = f1(x);
idx = find(y >= 80,1,'first');
y(idx:end) = f2(x(idx:end));
A
A 2011 年 6 月 15 日
You're awesome Walt.

サインインしてコメントする。


A
A 2011 年 6 月 21 日
If my function is:
y = f1(x);
How can I select an x value for a given y?
This is a silly question I know, but I cannot figure it out.
  5 件のコメント
A
A 2011 年 6 月 21 日
I implemented the above, but I had to use the index (like you showed in your previous answers as 'idx' instead of x.
Then I used that to find the time.
This works well for now, but ideally I want to get to the more rigorous solution.
Thanks Walt, let me know about the rest when you get a chance.
Walter Roberson
Walter Roberson 2011 年 6 月 21 日
Good point about the index; sorry about that.
If your y are in increasing order, then
find(SpecificY < y,1,'last')

サインインしてコメントする。


A
A 2011 年 6 月 23 日
Now I am trying to find the time constant for this system and I need to do it analytically.
So I know the time constant is just 63.2% of the final value...
V_In is the step input (100 V) V_C_SS is the function that is going from 0V to 100V
Time_Value = V_In * .632; %Find the value that is 63.2%
idxx = find(V_C_SS <= Time_Value); %Create index
Time_Diff = abs(V_C_SS - Time_Value);
Time_Check = idxx(Time_Diff == min(Time_Diff));
Time_Constant = t(idxx)
Doesn't work. I tried to apply what you have showed me here. I just need to know the time it takes for the function to reach 63.2% of the final value.
  3 件のコメント
Walter Roberson
Walter Roberson 2011 年 6 月 23 日
Time_Value = V_In * .632;
Time_Check = find(V_C_SS <= Time_Value,1,'last');
Time_Constant = t(Time_Check);
A
A 2011 年 6 月 23 日
Ok I see now. Thank you.

サインインしてコメントする。


A
A 2011 年 6 月 23 日
On the switching case here:
y = f1(x);
idx = find(y >= 80,1,'first');
y(idx:end) = f2(x(idx:end));
How can I stop f1 and only have f2 start where f1 ends? Using the final values of f1 for IC's of f2.
  4 件のコメント
Walter Roberson
Walter Roberson 2011 年 6 月 23 日
That's what the code you posted above does, unless f2 is sensitive to the position of the x as well as to the value of the x. If it _is_ sensitive to the position of the x, then the next thing we would need to know is whether the f2 values are calculated independently or if values from earlier input influence later output.
If there is dependence on the position then,
y = f1(x);
y2 = f2(x);
idx = find(y >= 80,1,'first');
y(idx:end) = y2(idx:end);
A
A 2011 年 6 月 23 日
Ok yes this works great, thank you.

サインインしてコメントする。


A
A 2011 年 6 月 23 日
Referring to the time constant again:
Time_Value = V_In * .632;
Time_Check = find(V_C_SS <= Time_Value,1,'last');
Time_Constant = t(Time_Check);
My function is sinusoid and oscillates...
So my function drops below 63.2% (Time_Value) more than once. How can I select only the first time it goes to this value?
  1 件のコメント
Walter Roberson
Walter Roberson 2011 年 6 月 23 日
Time_Check = find(V_C_SS > Time_Value,1,'first') - 1;
Provided that your values do not start out above the time constant, dip, rise, with it being the point on the rise you want to get.

サインインしてコメントする。


A
A 2011 年 6 月 23 日
Ah I see. You are great with the indices... thank you Walt.

A
A 2011 年 6 月 24 日
Using only one function, I want to 'track' an input (voltage) schedule.
I.E. I have made a voltage schedule that I read in... it has a time vector and a voltage vector.
The voltage changes in steps. It starts at 0 and then will jump to 80V, stay for a few milliseconds and then drop down to 25V, then back up to 60V, etc.
I am basically simulating a response (say a DC motor), and I want to see how well I can track this performance using my function.
What is the best way to go about this?

カテゴリ

Help Center および File ExchangeAnnotations についてさらに検索

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by