2017-02-08 11 views
1

У меня есть интегральное выражение, которое я определил на Matlab, используяПроблем прикрепление функции ручки на Matlab для интегрального выражения

x = 0:1/1000:1; 
g = @(x) (exp(-1./x.^2).*heaviside(x)).*(exp(-1./(1-x).^2).*heaviside(1-x)); 
t = 0:1/1000:1; 
f = zeros(size(t)); 
for i = 1:length(t) 
    f(i) = integral(g,0,t(i)); 
end 

я могу построить его, например, с помощью plot(t,f), но и для других целей, я хотел бы прикрепите дескриптор функции к f, то есть примерно f = @(t) zeros(size(t)). Пока я не смог понять это. f = @(t) integral(@(x)g(x),0,t) также недостаточно.

ответ

2

Извините, я не могу комментировать. Но работает ли это?

funcHand= @(t) integral(g,0,t); 

Вы не должны определять й в коде выше, так как вход integral является функция ручки.

Затем, чтобы проверить это то же самое:

f2 = zeros(size(t)); 
for i = 1:length(t) 
    f2(i) = funcHand(t(i)); 
end 

Упс, другой ответ сказал, что все выше (только заменил цикл с arrayfun я не видел его во время написания ответа

..

Edit

Если вы хотите построить в для цикла, попробуйте:

funcHand= @(t) arrayfun(@(u) integral(g, 0, u),t); 

И тест:

plot(funcHand(t)) 
+0

Спасибо за вашу помощь, но, к сожалению, ваш код также не работает. Я получаю те же ошибки. По сути, я хочу иметь возможность писать 'f (t)' в следующих строках. –

+0

Побей меня. Ницца. –

+0

Я только что изложил ваш ответ ... надеюсь, он отвечает Q. –

1

Попробуйте

f = @(u) integral(g, 0, u) 

Дополнительный уровень косвенности в g кажется излишним. Обратите внимание, что я вызвал вход u. Имейте в виду, что f не принимает векторы как свои входы. Итак, что-то вроде f(t) в вашей текущей рабочей области не создаст тот же массив, что и ваш цикл for. Вам придется перебирать массив. Удобная функция arrayfun сделает это для вас:

o = arrayfun(f, t) 

Это примерно эквивалентно петле у вас есть сейчас:

o = zeros(size(t)); 
for i = 1:length(o) 
    o(i) = f(t(i)); 
end 

arrayfun фактически может быть включено в вашу функцию ручки, чтобы его обработать вектор аргументы:

h = @(t) arrayfun(f, t) 

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

f = @(t) arrayfun(@(u) integral(g, 0, u), t) 
+0

Я получаю сообщение об ошибке: 'А и В должны быть плавающей точкой скаляры. Ошибка в интеграле @ (u) (g, 0, u) '. Сможете ли вы расширить то, что вы подразумеваете под «вам придется проходить через массив»? –

+0

@ пользователь3482534. Похоже, вы пытаетесь пройти в 't' для вас. Я специально упомянул, что это будет невозможно. См. Мое обновленное решение. Кроме того, @ Джон ответ. –