# How to define a function consisting of multiple parts (i.e different f:n at different times) in Matlab using a single equation?

102 vues (au cours des 30 derniers jours)
Harshit Jain le 22 Avr 2013
Example
f(x)
= x^2 for 0<x<1;
= x^3 for 1<x<2;
= ......and so on.
##### 0 commentairesAfficher -2 commentaires plus anciensMasquer -2 commentaires plus anciens

Connectez-vous pour commenter.

### Réponse acceptée

Sally Al Khamees le 23 Déc 2016
Modifié(e) : Sally Al Khamees le 21 Fév 2017
If you have R2016b and the Symbolic Math Toolbox installed, you can just use the piecewise function:
Here is an example:
syms y(x);
y(x) = piecewise(1<x <2, x^3, 2 <= x <= 3, x^2, 1)
fplot(y)
%You can evaluate it at one point. Example when x = 2
y(2)
%You can evaluate a vector. Example
v = linspace(1,4,4)
y(v)
##### 1 commentaireAfficher -1 commentaires plus anciensMasquer -1 commentaires plus anciens
Samuel Silas Ng'habi le 27 Avr 2023
What if the value and the conditions are expressed as nth -term. How will you plot the function See pictures attached

Connectez-vous pour commenter.

### Plus de réponses (2)

Walter Roberson le 22 Avr 2013
You can define it symbolically using MuPAD's "piecewise" construct.
In some cases you can define it numerically using logical constructs such as
(x > 1 & x < 2) .* x.^3 + (x > 0 & x < 1) .* x^2
This will not work properly for locations that generate NaN or infinity when evaluated for any part. For example, if f(x) = 1 for x = 0, and f(x) = 1/x for other x, then you cannot use
(x == 0) .* 1 + (x ~= 0) .* 1./x
because the second part will generate NaN when evaluated for x(K) = 0, and the NaN multiplied by the 0 of (x(K) ~= 0) will still be NaN instead of vanishing to 0 as it does for finite values. Similarily, 0 * inf is NaN rather than 0.
##### 1 commentaireAfficher -1 commentaires plus anciensMasquer -1 commentaires plus anciens
Harshit Jain le 22 Avr 2013
thanks

Connectez-vous pour commenter.

John BG le 23 Déc 2016
y=[1:0.001:2].^3
##### 4 commentairesAfficher 2 commentaires plus anciensMasquer 2 commentaires plus anciens
Stephen23 le 22 Fév 2017
@John BG: how could this be used in a function of x (as the question requests), e.g.:
fun = @(x) ???
Note that both Sally Al Khamees' and Walter Roberson's answers provide this.
Walter Roberson le 22 Fév 2017
Consider, for example, if the task is to find the point at which the function equals 3.5,
x0 = 2 * rand(); %range is 0 to 2
fzero(@(x) f(x) - 3.5, x0)
Using a fixed dx is not going to be able to handle this task -- not unless dx = eps(realmin), so that you are testing all 2^62 representable numbers between 0 and 2.
You could, of course, write code that assumes that the input is a scalar:
function y = f(x)
y = 0;
if x > 0 & x < 1
y = x.^2;
elseif x > 1 & x < 2
y = x.^3;
end
end
and you could loop that code for non-scalar x.
You can use logical indexing:
function y = f(x);
y = zeros(size(x));
mask = x > 0 & x < 1;
mask = x > 1 & x < 2;
end
You can define it with an anonymous function,
f = @(x) (x > 1 & x < 2) .* x.^3 + (x > 0 & x < 1) .* x^2;
You can look at the pattern and predict
f = @(x) (x ~= ceil(x)) .* x.^(1 + ceil(x));
And all of those versions are functions that could be used as functions over arbitrary domains such as for fzero() purposes.
But using a fixed dx is not an approach that can be used for this kind of common application.

Connectez-vous pour commenter.

### Catégories

En savoir plus sur Assumptions dans Help Center et File Exchange

### Community Treasure Hunt

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

Start Hunting!

Translated by