وظيفة متجهية مع جزء داخلي متكامل ثنائي الأبعاد

1

أواجه مشكلة في محاولة كتابة دالة ثنائية الأبعاد مع إدخالات متجهية تحتوي على جزء داخلي.

وظيفتي هي كما يلي:

thick = 40e-9; 
overlap = (@(E,T)integral2(@(x,y)exp(E.*T.*abs(x-y)),0,thick,0,thick)); 

إذا قمت باستدعاء الوظيفة باستخدام المدخلات العددية ، مثل التداخل (1،1) ، فهذا يعمل بشكل جيد.

overlap(1,1)
ans = 1.6000e-15

ومع ذلك ، إذا قمت باستدعاء الوظيفة باستخدام مدخلات المتجهات لـ E و T ، على سبيل المثال E=1:1:10 و T=1:1:10 ، هذا لا يعمل. أحصل على ما يلي:

Error using  .* 
Matrix dimensions must agree.

هل يعرف أحد كيف يجعل هذا العمل مع المدخلات الموجهة؟ أنا أبحث عن طريقة للقيام بذلك في الدالة المضمنة نفسها ، بدون حلقات.

1 إجابة

0

يشير الخطأ إلى E و T لها شكل مختلف عن x و y ، محتمل integral2 يمر صفائف ل x و y . هذه الوظيفة المريحة غير مجهزة لدمج وظائف قيم الصفيف ، لذا يمكنها استخدام المدخلات ذات قيم الصفيف بحرية كما تراه مناسبًا.

هناك حل سهل لمشكلتك: انقل الأسي خارج مجموعتك:

>> overlap = @(E,T)integral2(@(x,y)exp(abs(x-y)),0,thick,0,thick).^(E.*T); 
>> overlap(1,1)                                                            

ans =

   1.6000e-15

>> overlap(E,T)                                                            

ans =

   1.0e-14 *

    0.1600    0.0000    0.0000    0.0000         0         0         0         0         0         0

ليست نتيجة مثيرة للاهتمام للغاية بسبب الدقة المزدوجة ، ولكن ما يهم هو أن الخطأ قد اختفى والنتيجة بالحجم المناسب.

ولكن بعد ذلك يمكنك أن ترى بسهولة أنه ليس عليك حتى الاندماج داخل وظيفتك ، لأن التكامل لم يعد يعتمد على إدخالات وظيفتك. هذا سيجعل مكالماتك الوظيفية أسرع بكثير :

>> thick = 1; % I don't like zeros
>> int = integral2(@(x,y)exp(abs(x-y)),0,thick,0,thick); % integrate only once!
>> overlap = @(E,T) int.^(E.*T);                        
>> overlap(1,1)

ans =

    1.4366

>> overlap(1:2,1:2)

ans =

    1.4366    4.2589
:مؤلف
فوق
قائمة طعام