Why I'm I getting this error when I try to call the function myfourier in another m file?

7 visualizzazioni (ultimi 30 giorni)
myfourier.m file
function [a0 an bn fs] = myfourier(f, flim, N)
syms t
syms N
T = flim(end)-flim(1);
w0 = 2*pi/T;
fs = 0.0;
for i = 0:N
for k= 2:length(flim)
an= (2/T)*int(f(k-1)*cos(i*w0*t),t,flim(k-1),flim(k));
ann(i+1)=an;
bn= (2/T)*int(f(k-1)*sin(i*w0*t),t,flim(k-1),flim(k));
bnn(i+1)=bn;
fs= fs + an*cos(w0*i*t)+bn*sin(w0*i*t);
end
if i==0
fs = fs/2;
end
%a0 is calculated first (for i=0). The Fourier series starts with a0/2 ...
end
a0 = 0.0;
for k= 2:length(flim)
a0= a0+(2/T)*int(f(k-1),t,flim(k-1),flim(k));
end
disp('a0=')
disp(a0)
for i= 1:N
disp('an=')
disp(ann(i+1))
end
for i= 1:N
disp('bn=')
disp(bnn(i+1))
end
fs
title("Fourier series approximation of f against estimated function f with N="+N)
hold on
fourier = matlabFunction(fs);
grid on
ax = gca;
ax.XAxisLocation = 'origin';
ax.YAxisLocation = 'origin';
xlabel('x')
ylabel('y')
t = flim(1):0.01:flim(end);
plot(t,fourier(t))
for k= 2:length(flim)
fplot(f(k-1),[flim(k-1), flim(k)])
end
legend('Fourier approximation of f')
end
Excercise4.m file
f= [-t- 2*pi, -t, 2*pi- t, -t-4*pi];
flim= [-3*pi,-pi,pi,3*pi,5*pi];
N= 5;
[a0 an bn fs] = myfourier(f, flim, N);
Error using symengine>@(t)(sin(t.*pi).*4.0)./pi+(sin(t.*pi.*3.0).*(4.0./3.0))./pi+(sin(t.*pi.*5.0).*(4.0./5.0))./pi+6.0
Too many input arguments.
Error in Excercise4 (line 5)
[a0 an bn fs] = myfourier(f, flim, N);

Risposta accettata

Torsten
Torsten il 14 Dic 2022
Modificato: Torsten il 14 Dic 2022
Give another name to the MATLAB function created here:
fourier = matlabFunction(fs);
There is already a MATLAB built-in function with the same name:
It won't produce an error in this case, but confuses and will lead to an error if you wanted to use MATLAB's "fourier" somewhere else in your code.
%Excercise4.m file
syms t
f= [-t-2*pi, -t, 2*pi-t, -t-4*pi];
flim= [-3*pi,-pi,pi,3*pi,5*pi];
N= 5;
[a0 an bn fs] = myfourier(f, flim, N);
a0= -12.5664 an= 11.3137 an= -8 an= 3.7712 an= 0 an= -2.2627 bn= -1.8385e-17 bn= 0 bn= 2.4689e-17 bn= -2 bn= 1.1469e-17
fs = 
%myfourier.m file
function [a0 an bn fs] = myfourier(f, flim, N)
syms t
T = flim(end)-flim(1);
w0 = 2*pi/T;
fs = 0.0;
ann = zeros(1,N+1);
bnn = zeros(1,N+1);
for i = 0:N
for k= 2:length(flim)
an= (2/T)*int(f(k-1)*cos(i*w0*t),t,flim(k-1),flim(k));
bn= (2/T)*int(f(k-1)*sin(i*w0*t),t,flim(k-1),flim(k));
ann(i+1) = ann(i+1) + an;
bnn(i+1) = bnn(i+1) + bn;
fs= fs + an*cos(w0*i*t)+bn*sin(w0*i*t);
end
if i==0
fs = fs/2;
a0 = ann(1);
end
%a0 is calculated first (for i=0). The Fourier series starts with a0/2 ...
end
disp('a0=')
disp(a0)
for i= 1:N
disp('an=')
disp(ann(i+1))
end
for i= 1:N
disp('bn=')
disp(bnn(i+1))
end
fs
title("Fourier series approximation of f against estimated function f with N="+N)
hold on
fourier = matlabFunction(fs);
grid on
ax = gca;
ax.XAxisLocation = 'origin';
ax.YAxisLocation = 'origin';
xlabel('x')
ylabel('y')
t = flim(1):0.01:flim(end);
plot(t,fourier(t))
for k= 2:length(flim)
fplot(f(k-1),[flim(k-1), flim(k)])
end
legend('Fourier approximation of f')
end
  2 Commenti
Torsten
Torsten il 14 Dic 2022
Modificato: Torsten il 14 Dic 2022
All in one function works ? Without the splitting in calling script and function ?
And the script part must be before the function definition.
Walter Roberson
Walter Roberson il 18 Dic 2022
Modificato: Walter Roberson il 18 Dic 2022
fouriergraph = matlabFunction(fs);
When you use matlabFunction() with no 'vars' option, then the number of input parameters is determined by counting symvar() of the expression. If the symbolic engine cannot find any "unbound" variables in the expression then symvar() is empty and the generated function will expect no inputs.
A "bound" variable is, roughly speaking, one that could be entirely replaced in the expression without changing the result of the expression. But not exactly that. It is more that the variable is acting as a temporary variable with values to be filled in automatically by the symbolic engine. For example, int(f(x),x,a,b) could be replaced by int(f(DUMMY),DUMMY,a,b) and you would still get the same result provided that f(DUMMY) does not contain any references to x. Other functions with "bound" variables include symsum() and symprod()
So if you use matlabFunction() without any 'vars' option and the function is effectively constant on inputs, then matlabFunction would leave out defining any input parameter, creating a function with no inputs expected.

Accedi per commentare.

Più risposte (0)

Tag

Community Treasure Hunt

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

Start Hunting!

Translated by