Create continuous custom functions like the built in's
19 visualizzazioni (ultimi 30 giorni)
Mostra commenti meno recenti
Hey, I'm trying to create a custom function like "cos", 'sin", "exp".
At the time I have sth like
f = @(x) TIME_CONSUMING_FUCTIONS(x)
I need to calculate f for many inpus and that takes a lot of time because the handler is running at each loop.
Can make it like a ready-made function which will give me instantly the answers? Maybe running it for a wide range of x's and use interpolation after? Don't have an idea.
Thanks!
5 Commenti
Stephen23
il 14 Lug 2022
Modificato: Stephen23
il 14 Lug 2022
"Can make it like a ready-made function which will give me instantly the answers?"
"Maybe running it for a wide range of x's and use interpolation after?
If you know the data range AND can generate sufficient points to give you the required output accuracy...
Risposte (1)
Simar
il 6 Ott 2023
Modificato: Simar
il 6 Ott 2023
Hi Basil,
I understand that you are seeking a faster way to calculate a custom time-consuming function, potentially by precomputing values and using interpolation for new inputs.Yes, it can be achieved and is a good strategy to speed up the execution. Here is an example that would help:
1. Define your function. For example, let us assume the function is a complex mathematical expression and is vectorized and can handle array inputs:
TIME_CONSUMING_FUNCTION = @(x) sin(x) + cos(x.^2) + exp(x.^3);
2. Define range of inputs for which you want to pre-calculate function values:
x_min = -10;
x_max = 10;
step_size = 0.01;
3. Calculate function values for this range of inputs and store them in a reference table for future use:
x_array = x_min:step_size:x_max;
f_array = TIME_CONSUMING_FUNCTION(x_array);
4. Create an anonymous function that uses interpolation to estimate function value for any input within the predefined range. The “spline” option in the “interp1” function specifies that spline interpolation should be used. This method can provide a good approximation for many types of functions.
f = @(x) interp1(x_array, f_array, x, 'spline');
Use f(x) to get interpolated value. This should be much faster than calling TIME_CONSUMING_FUNCTION(x), especially if x is a large array.
Here is the complete code:
% Define the time-consuming function
TIME_CONSUMING_FUNCTION = @(x) sin(x) + cos(x.^2) + exp(x.^3);
% Define the range of inputs and the step size
x_min = -10;
x_max = 10;
step_size = 0.01;
% Create the input array
x_array = x_min:step_size:x_max;
% Calculate the function values for these inputs
f_array = TIME_CONSUMING_FUNCTION(x_array);
% Create an anonymous function for interpolation
f = @(x) interp1(x_array, f_array, x, 'spline');
% Now you can use f(x) to get the interpolated value at ‘x = 0.5’
result = f(0.5);
This approach works well when your function is smooth and does not have rapid changes. If the function has rapid changes, you may need to use a smaller step size or a more sophisticated interpolation method.
Please refer to the documentation link-
Hope it helps!
Best Regards,
Simar
0 Commenti
Vedere anche
Categorie
Scopri di più su Splines in Help Center e File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!