Оценить символическое выражение в MATLAB - PullRequest
0 голосов
/ 27 июня 2018

Я пытаюсь оценить функцию, представляющую собой бесконечный косинус-ряд при некоторых входных значениях.

РЕДАКТИРОВАТЬ : Размещение изображения, чтобы описать, как выглядит бесконечный ряд enter image description here

Я написал следующий код, чтобы описать его в MATLAB.

function func = cosfun_hat(a,i)
    syms m x;

    assume(m,'integer');
    assumeAlso(m > 0);

    sum(x) = sqrt(1-a^2)*symsum(sqrt(2)*a^m*cos(i*sym(pi)*x*2^m+1),m,0,Inf);
    func(x) = sum(x);
end

Я хочу оценить возвращенную 'функцию' func, чтобы получить числовые значения для некоторого входного диапазона, скажем x_in = 0:0.001:1.

%Trying to evaluate func at x = 2
%In the command window I write
func = cosfun_hat(0.5,2);
func(2)

, который возвращает символическое выражение:

(2^(1/2)*3^(1/2)*sum((1/2)^m*(exp(- pi*exp(m*log(2))*4*i - i)/2 + exp(pi*exp(m*log(2))*4*i + i)/2), m == 0..Inf))/2

Я пытался использовать subs для вычисления выражения:

%In the command window
syms y;
w(y) = func(y);
y = 2;
subs(w);

Но это возвращает то же символическое выражение. Я совершенно новичок в символической MATLAB.

Спасибо!

РЕДАКТИРОВАТЬ На основании комментария @NickyMattsson я пытался

vpa(func(2)) 

, который возвращает числовое значение выражения. Тем не мение, vpa(func(0.1)) возвращает символическое выражение:

ans =

1.2247448713915890490986420373529*numeric::sum((1/2)^m*(exp(- (pi*exp(m*log(2))*i)/5 - i)/2 + exp((pi*exp(m*log(2))*i)/5 + i)/2), m == 0..Inf)

Та же проблема с использованием double(func(0.1)), double ничего не возвращает и застревает.

Ответы [ 2 ]

0 голосов
/ 01 июля 2018

Придумал способ сделать это без использования символической MATLAB.

function func = cosfun_hat(a,i,x)
    m = 0;
    sum = zeros(1,length(x));
    sum2 = Inf(1,length(x));
    while max(sum2-sum) > 1e-16
        disp(m);
        sum2 = sum;
        sum = sum + sqrt(1-a^2)*sqrt(2)*a^m*cos(i*pi*x*2^(m+1));
        m = m+1;

    end
    func = sum;
end

Сумма сходится за 100 итераций.

Теперь, если я это сделаю,

%In command window
x_in = -2:0.001:2;
f = cosfun_hat(0.6,2,x_in);
plot(x_in,f);

Я получаю сюжет:

enter image description here

Спасибо всем за помощь!

0 голосов
/ 27 июня 2018

Используйте эту команду

double(func(2))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...