linear interpolation of function handle
显示 更早的评论
Hi everybody, I need to calculate the value in the range pi <= wave_angle < pi/2 of the a function handle @(freq_wave,wave_angle) which is defined as:
((log(B/T))^-1).*(0.87/CB).^((1+Fn).*cos(wave_angle)).*(1/3-(2/3).*cos(wave_angle))
in the range ((wave_angle >=0) & (wave_angle <= pi/2))
((log(B/T))^-1).*(0.87/CB).^(1+Fn) in the range (wave_angle=pi)&(vel_nave>V_G(freq_wave)./2)&(Fn_rel(freq_wave)>=0.12)
((log(B/T))^-1).*(0.87/CB) in the range (wave_angle=pi)&(vel_nave<V_G(freq_wave)./2)+ ((log(B/T))^-1).*(0.87/CB) .*(wave_angle=pi)&(Fn_rel(freq_wave)<0.12);
but I don't konw which function is the best to use. Thanks in advance for your help.
7 个评论
Matt J
2023-11-29
Since you have a continuous formula for the function, there is nothing to interpolate. Just evaluate it at the locations you want.
Gianluca Angelini
2023-11-29
Torsten
2023-11-29
Please supply a complete code where all the variables and functions are defined.
In your definition of a1 from above, B, T, CB, Fn, vel_nave, function V_G, function Fn_rel are missing.
Gianluca Angelini
2023-11-29
As you can see, none of the four conditions is satisfied for your inputs. Thus the result is logical 0.
(Note that I added additional brackets around your conditions).
Extrapolating values for a1 over the limits where a1 is defined is completely arbitrary and thus nonsense.
B=22.5; T=7; CB=0.59; Fn=0.2; vel_nave=10.28; g=1;Lpp=1;
V_G=@(freq_wave) g/(2*freq_wave);
Fn_rel=@(freq_wave) (vel_nave-V_G(freq_wave)/2)/(g*Lpp)^0.5;
a1=@(freq_wave,wave_angle) ((log(B/T))^-1).*(0.87/CB).^((1+Fn).*cos(wave_angle)).*(1/3-(2/3).*cos(wave_angle)).*((wave_angle >=0) & (wave_angle <= pi/2)) +...
((log(B/T))^-1).*(0.87/CB).^(1+Fn) .*((wave_angle==pi)&(vel_nave>V_G(freq_wave)./2)&(Fn_rel(freq_wave)>=0.12)) +...
((log(B/T))^-1).*(0.87/CB) .*((wave_angle==pi)&(vel_nave<V_G(freq_wave)./2))+...
((log(B/T))^-1).*(0.87/CB) .*((wave_angle==pi)&(Fn_rel(freq_wave)<0.12));
freq_wave = 5;
wave_angle = 2.09;
((wave_angle >=0) & (wave_angle <= pi/2))
((wave_angle==pi)&(vel_nave>V_G(freq_wave)./2)&(Fn_rel(freq_wave)>=0.12))
((wave_angle==pi)&(vel_nave<V_G(freq_wave)./2))
((wave_angle==pi)&(Fn_rel(freq_wave)<0.12))
a1(5,2.09)
Gianluca Angelini
2023-11-29
回答(1 个)
Nipun
2023-12-21
Hi Gianluca,
I understand that you are trying to evaluate a semantic relation, given the variable values. In the illustrated case, the equation to be used changes according to the range of the input.
It seems like you have a piecewise function defined over different ranges of wave_angle. In MATLAB, you can use the if, elseif, and else statements to define a piecewise function. The if statements can be used to check the conditions for each range and evaluate the corresponding expression.
Here is a code snippet to help you with the same:
function result = your_function(freq_wave, wave_angle, B, T, CB, Fn, vel_nave)
if wave_angle >= 0 && wave_angle < pi/2
result = ((log(B/T))^-1) .* (0.87/CB).^((1+Fn).*cos(wave_angle)) .* (1/3 - (2/3) .* cos(wave_angle));
elseif wave_angle == pi && vel_nave > V_G(freq_wave)/2 && Fn_rel(freq_wave) >= 0.12
result = ((log(B/T))^-1) .* (0.87/CB).^(1+Fn);
elseif wave_angle == pi && vel_nave < V_G(freq_wave)/2
result = ((log(B/T))^-1) .* (0.87/CB);
elseif wave_angle == pi && Fn_rel(freq_wave) < 0.12
result = ((log(B/T))^-1) .* (0.87/CB) .* (wave_angle == pi) .* (Fn_rel(freq_wave) < 0.12);
else
% Define default behavior if none of the conditions are met
result = NaN; % or any default value you prefer
end
end
This function checks the conditions for each range of wave_angle and evaluates the corresponding expression. You can adjust the conditions and expressions based on your specific requirements. The result variable holds the final value of the function for a given set of input parameters.
Since the signature and description of functions "Fn_rel" and others were not provided, I assume that they work as expected.
Hope this helps.
Regards,
Nipun
类别
在 帮助中心 和 File Exchange 中查找有关 Interpolation 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!