2015-05-19 7 views
1

Я хотел бы оценить выражение, которое требует интеграла от определяемой пользователем функции.
У меня есть 3 входа для интегрального выражения, E, F и B. F и B - значения, хранящиеся в отдельных массивах. E - параметр, который я хотел бы интегрировать, начиная с значения 0 и заканчивая значением B. Я пытаюсь использовать интегральную функцию с пользовательской функцией, хотя я продолжаю получать ошибку измерения матрицы, которой я не занимаюсь понимают, что все значения для F, B (я думал) передаются как скалярные входы.Лучший способ интегрировать определенную пользователем функцию

Однако я понимаю, что для каждой итерации цикла я определяю новую функцию, это кажется «неэлегантным». Любые советы относительно 1. Почему он не будет работать как есть (т. Е. Ошибка с использованием *, размеры внутренней матрицы должны совпадать) 2. Любое более элегантное решение?

Вот петля

 for i=1:51 
       % DEFINE energy integrand, without prefixes 
       [email protected](E,F,B) sqrt(E)*exp(-8*pi*(m*q)^(0.5)*(B-E)/(3*h*F))/(exp(E/(k*Temp))+1); 
    % Integrate over energy range, store   
       J(i)=q*mu*8*pi*sqrt(2)*m.^1.5/h^3*Farray(1,i)*integral(@(E)nrgInt(E,Farray(1,i),Barray(i)),0,Barray(i)); 
       clear nrgInt 
     end 

Высокую оценку

ответ

1

Для вашего 1-й вопрос, потому что * в Matlab представляет собой матричный оператор, так что если не обе стороны операции являются скалярными, то оба они должны иметь соответствующий размер, т.е. m-by-n matrix * n-by-p матрицы

для 2-й вопрос, вы можете определить функцию по отдельности, а затем использовать vertorizing вместо для цикла:

J=q*mu*8*pi*sqrt(2)*m.^1.5/h^3*Farray(1,:)*integral(@(E)nrgInt(E,Farray(1,:),Barray(:)),0,Barray(:)); 
+0

Спасибо, я понимаю, что * был для матрицы, но я думал, что передаю ему только скаляры. Я продолжу свое решение, кажется, лучше, но мне любопытно, почему это дало мне ошибку *, если E, F и B были скалярами. – daFireman

+0

Привет, опять же, это не работает, и, похоже, оно связано с интегральной функцией. Если я просто определяю свой nrgInt и вызываю его из командной строки, он отлично работает, но если я попытаюсь его интегрировать, это дает мне проблему *, даже если я НЕ пропускаю матрицы. Как я могу интегрировать свою функцию? 'nrgInt = @ (E, F, B) sqrt (E) * exp (-8 * pi * (m * q)^(0,5) * (BE)/(3 * h * F))/(exp (E/(k * Temp)) + 1); ' ' интеграл (@ (E) nrgInt (E, 0,1,1), 0,1) Ошибка при использовании * Размеры внутренней матрицы должны совпадать. ' – daFireman

+0

Nevermind, решение менее интересно, чем я думал. Integral должен использовать операции массива по определению, я пытался заставить матричные операции использовать * вместо. * И/вместо ./. RTFM на помощь. – daFireman

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