2014-02-03 5 views
0

Я хочу рассчитать ряд Фурье для некоторой функции func.Matlab - определить общую переменную

Я строю этот метод:

function y = CalcFourier(accurate, func, a, b, val_x) 
    f = @(x) eval(func); 
    % calculate coefficients 
    a0 = (2/(b - a)) * calcArea(func, a , b); 
    an = (2/(b - a)) * calcArea(strcat(func, '*cos(2*n*pi*x/(b - a))'), a , b); 
    an = (2/(b - a)) * calcArea(strcat(func, '*sin(2*n*pi*x/(b - a))'), a , b); 
    partial = 0; 
    an_f = @(n) an; 
    bn_f = @(n) bn; 
    for n = 1:accurate 
     partial = partial + an_f(n)* cos(2*n*pi*val_x/(b - a)) + bn_f(n) * sin(2*n*pi*val_x/(b - a)); 
    end 

    y = (a0/2) + partial; 
end 

И это - приблизить коэффициент-х:

function area = calcArea(func, a, b) 
    f = @(x) eval(func); 
    area = (a - b) * (f(a) - f(b))/2; 
end 

На линии an = (2/(b - a)) * calcArea(strcat(func, '*cos(2*n*pi*x/(b - a))'), a , b); я получаю сообщение об ошибке:

??? Error using ==> eval 
Undefined function or variable 'n'. 

Error in ==> calcArea>@(x)eval(func) at 2 
    f = @(x) eval(func); 

Error in ==> calcArea at 3 
    area = (a - b) * (f(a) - f(b))/2; 

Error in ==> CalcFourier at 5 
    an = (2/(b - a)) * calcArea(strcat(func, 
    '*cos(2*n*pi*x/(b - a))'), a , b); 

>> 

Есть ли возможность объявить n как «некоторую константу»? Благодаря!

+2

В MATLAB нет констант. Вы можете объявить n как [global] (http://www.mathworks.com.au/help/matlab/ref/global.html). – Marcin

ответ

0

Вы пытаетесь использовать переменную с именем n в строке 4 вашего кода. Однако в то время n еще не определен, это происходит только в цикле for. (Совет: используйте dbstop if error во все времена, таким образом вы можете легче обнаружить проблему).

Хотя я не совсем понимаю, что вы делаете, я считаю, что вам нужно что-то вроде этого:

n=1 в начале вашей функции CalcFourier. Конечно, вы также можете выбрать ввод n в качестве переменной или переместить соответствующую строку в место, где фактически определено значение n.

Кроме того, вы, кажется, используете n в calcArea, но вы не пытаетесь передать его функции.


Все это было бы легче найти, если вы избегали использовать eval, возможно, вы можете попробовать создать функцию без него, а затем будет MATLAB легко направлять вас проблемы в вашем коде.

0

Если имеется символическая панель инструментов, ее можно использовать для объявления символических переменных, которые могут быть обработаны как «некоторая переменная» и заменены значением позже.

однако необходимо внести некоторые изменения для его реализации, в основном преобразовывая анонимные функции в символические функции и любую функцию n в символические функции. И, наконец, полученный ответ нужно будет преобразовать из символического значения в более легкое для обработки значение, например. double

быстро реализует это для вашего кода следующим образом;

function y = test(accurate, func, a, b, val_x) 
syms n x % declare symbolic variables 
%f = symfun(eval(func),x); commented out as not used 

Две линии выше показывают объявление символических переменных и синтаксис для создания символической функции

% calculate coefficients 
a0 = symfun((2/(b - a)) * calcArea(func, a , b),x); 
an = symfun((2/(b - a)) * calcArea(strcat(func, '*cos(2*n*pi*x/(b - a))'),... 
... a , b),[x n]); 
bn = symfun((2/(b - a)) * calcArea(strcat(func, '*sin(2*n*pi*x/(b - a))'),... 
... a , b),[x n]); 
partial = 0; 

определения функций в в коде объединяются в строках выше, отметим, что функции от x и n, замена x_val выполняется позже здесь ...

for n = 1:accurate 
    partial = partial + an(val_x,n)* cos(2*n*pi*val_x/(b - a)) +... 
    ... bn(val_x,n) * sin(2*n*pi*val_x/(b - a)); 
end 

для цикла которая теперь заменяет символический п со значениями и вызывает символические функции с x_val и каждого значения п

y = (a0/2) + partial; 
y = double(y); 
end 

Наконец решение вычисляется, а затем превращается в два раза;

Отказ от ответственности: Я не проверял, генерирует ли этот код правильное решение, однако я надеюсь, что он даст вам достаточно информации, чтобы понять, что было изменено, и почему выполнить процесс, указанный в вашем коде выше, используя символический набор инструментов для обратитесь к вопросу ...

Смежные вопросы