2016-06-29 4 views
-1

В приведенном ниже сценарии, в цикл для вычисления двойных интеграций, я все время получаю сообщение об ошибке, и я не уверен, почему:Дважды Численное интегрирование ошибки

Error using * 
Inner matrix dimensions must agree. 

Error in @(t,p)-sin(t)*(G(:,1)*cos(p)+H(:,1)*sin(p)) 


Error in @(t,p)B{k}(t,p).*A{k}(t,p).*(V(t)-Veq).*sin(t) 


Error in integral2Calc>integral2t/tensor (line 228) 
     Z = FUN(X,Y); NFE = NFE + 1; 

Error in integral2Calc>integral2t (line 55) 
[Qsub,esub] = tensor(thetaL,thetaR,phiB,phiT); 

Error in integral2Calc (line 9) 
    [q,errbnd] = integral2t(fun,xmin,xmax,ymin,ymax,optionstruct); 

Error in integral2 (line 106) 
    Q = integral2Calc(fun,xmin,xmax,yminfun,ymaxfun,opstruct); 

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

Спасибо!

%%Calculation of dH/dt for mode m=1 for the entire sphere, NH and SH 
clear all 
%%Radius of photosphere 
r = 6.957*(10^5); %In km 
R = 1/r; %This will come in handy later 

%%Call in spherical harmonic coefficients, change the 535 figure as more 
%%data is added to the spreadsheets 
G(:,1) = xlsread('G Coefficients.xls', 'D3:D535'); 
G(:,2) = xlsread('G Coefficients.xls', 'F3:F535'); 
G(:,3) = xlsread('G Coefficients.xls', 'I3:I535'); 
G(:,4) = xlsread('G Coefficients.xls', 'M3:M535'); 
G(:,5) = xlsread('G Coefficients.xls', 'R3:R535'); 
G(:,6) = xlsread('G Coefficients.xls', 'X3:X535'); 
G(:,7) = xlsread('G Coefficients.xls', 'AE3:AE535'); 
G(:,8) = xlsread('G Coefficients.xls', 'AM3:AM535'); 
G(:,9) = xlsread('G Coefficients.xls', 'AV3:AV535'); 

H(:,1) = xlsread('H Coefficients.xls', 'D3:D535'); 
H(:,2) = xlsread('H Coefficients.xls', 'F3:F535'); 
H(:,3) = xlsread('H Coefficients.xls', 'I3:I535'); 
H(:,4) = xlsread('H Coefficients.xls', 'M3:M535'); 
H(:,5) = xlsread('H Coefficients.xls', 'R3:R535'); 
H(:,6) = xlsread('H Coefficients.xls', 'X3:X535'); 
H(:,7) = xlsread('H Coefficients.xls', 'AE3:AE535'); 
H(:,8) = xlsread('H Coefficients.xls', 'AM3:AM535'); 
H(:,9) = xlsread('H Coefficients.xls', 'AV3:AV535'); 

%%Set function v which always remains the same 
nhztoradperday = 2*pi*86400*(10^(-9)); 
a = 460.7*nhztoradperday; 
b = -62.69*nhztoradperday; 
c = -67.13*nhztoradperday; 

B{1} = @(t,p) -sin(t)*(G(:,1)*cos(p) + H(:,1)*sin(p)); 

B{2} = @(t,p) -3*sin(t)*cos(t)*(G(:,2)*cos(p) + H(:,2)*sin(p)); 

B{3} = @(t,p) -1.5*(5*(cos(t)^2)-1)*sin(t)*(G(:,3)*cos(p) + H(:,3)*sin(p)); 

B{4} = @(t,p) -2.5*(7*(cos(t)^3)-3*cos(t))*sin(t)*(G(:,4)*cos(p) + H(:,4)*sin(p)); 

B{5} = @(t,p) -1.875*sin(t)*(21*(cos(t)^4)-14*(cos(t)^2)+1)*(G(:,5)*cos(p) + H(:,5)*sin(p)); 

B{6} = @(t,p) -2.625*cos(t)*sin(t)*(33*(cos(t)^4)-30*(cos(t)^2)+5)*(G(:,6)*cos(p) + H(:,6)*sin(p)); 

B{7} = @(t,p) -0.4375*sin(t)*(429*(cos(t)^6)-495*(cos(t)^4)+135*(cos(t)^2)-5)*(G(:,7)*cos(p) + H(:,7)*sin(p)); 

B{8} = @(t,p) -0.5625*cos(t)*sin(t)*(715*(cos(t)^6)-1001*(cos(t)^4)+385*(cos(t)^2)-35)*(G(:,8)*cos(p) + H(:,8)*sin(p)); 



A{1} = @(t,p) 0.5*R*cos(t)*(G(:,1)*cos(p) + H(:,1)*sin(p)); 

A{2} = @(t,p) 0.5*R*cos(2*t)*(G(:,2)*cos(p) + H(:,2)*sin(p)); 

A{3} = @(t,p) 0.125*R*cos(t)*(15*(cos(t)^2)-11)*(G(:,3)*cos(p) + H(:,3)*sin(p)); 

A{4} = @(t,p) 0.125*R*(-3*cos(2*t)+7*(cos(t)^4-3*sin(t)^2*cos(t)^2))*(G(:,4)*cos(p) + H(:,4)*sin(p)); 

A{5} = @(t,p) 0.0625*R*(21*(cos(t)^5)-(cos(t)^3)*(14+84*(sin(t)^2))+cos(t)*(1+28*(sin(t)^2)))*(G(:,5)*cos(p) + H(:,5)*sin(p)); 

A{6} = @(t,p) 0.0625*R*(33*(cos(t)^6)-(cos(t)^4)*(165*(sin(t)^2)+30)+90*(sin(t)^2)*(cos(t)^2)+5*cos(2*t))*(G(:,6)*cos(p) + H(:,6)*sin(p)); 

A{7} = @(t,p) 1/128*R*(429*(cos(t)^7)-(cos(t)^5)*(495+2574*(sin(t)^2))+(cos(t)^3)*(135+1980*(sin(t)^2))-cos(t)*(5+270*(sin(t)^2)))*(G(:,7)*cos(p) + H(:,7)*sin(p)); 

A{8} = @(t,p) 1/128*R*(715*(cos(t)^8)-1001*(cos(t)^6)+385*(cos(t)^4)-35*(cos(t)^2)+(sin(t)^2)*(-5005*(cos(t)^6)+5005*(cos(t)^4)-1155*(cos(t)^2)+35))*(G(:,8)*cos(p) + H(:,8)*sin(p)); 

V = @(t) a + (b*cos(t)^2) + (c*cos(t)^4); 
Veq = V(0); 

intNH = zeros(length(G),9); 
intSH = zeros(length(G),9); 
intSun = zeros(length(G),9); 
for k=1:8 
    fun{k} = @(t,p) B{k}(t,p).*A{k}(t,p).*(V(t)-Veq).*sin(t); 
    intNH(:,k) = integral2(fun{k},0,pi/2,0,2*pi); 
    intSH(:,k) = integral2(fun{k},pi/2,pi,0,2*pi); 
    intSun(:,k) = integral2(fun{k},0,pi,0,2*pi); 
end 

for i=1:length(G) 
    NH(i) = sum(intNH(i,:)); 
    SH(i) = sum(intSH(i,:)); 
    Sun(i) = sum(intSun(i,:)); 
end 
+1

Не сбрасывайте здесь огромное количество кода и говорите «у него есть ошибка». Пожалуйста, прочитайте [mcve] и [ask]. – David

+0

Я отредактировал его, чтобы включить ошибку –

+0

Ошибка довольно ясная _ "'arrayvalued' не является признанным параметром. Список допустимых аргументов пары имя-значение см. В документации для этой функции ." _. Поэтому '' arrayvalued'' не является допустимым параметром. Вам нужно посмотреть документацию для функции (для вашей версии Matlab). Введите 'doc integral2', чтобы получить документацию. – patrik

ответ

1

К сожалению, вы пытаетесь попытаться, возможно, не работать как есть. Учитывая, что я знаю историю вопроса, я знаю, что вы пытаетесь интегрировать функцию с массивом. This worked in 1d, но я боюсь, что это не сработает в 2d.

Если вы посмотрите на помощи integral2, как это уже было предложено в комментариях, вы увидите следующее:

Все входные функции должны принимать массивы в качестве входных данных и работают поэлементно. Функция Z = FUN(X,Y) должна принимать массивы X и Y того же размера и возвращать массив соответствующих значений.

Это означает, что выход из fun ввода integral2 не может иметь больше размеров, чем на входе; другими словами, integral2 будет интегрировать только скалярные функции.

После беглого взгляда на варианты, я не думаю, что встроенные интеграторы 2d поддерживают это. У вас есть два варианта, и каждый из них неэффективен, поэтому вы должны попробовать оба и посмотреть, что лучше для вашего приложения.

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

Второй вариант - выполнить двойной интеграл как два отдельных интеграла. Я имею в виду, формально делает

integrated_result = integral(@(t)integral(@(p) fun(t,p),p1,p2,'arrayvalued',true),... 
          t1,t2,'arrayvalued',true); 

интегрировать в p из p1 в p2 и от t1 к t2. Это будет медленным, потому что для каждого значения внешних переменных вам нужно позвонить integral.

+0

Спасибо, это позор, метод 1d не будет работать.У меня действительно есть скрипт для этого 2d-метода, который работает, но он занимает около 15-20 минут для запуска. Я просто надеялся, что этот метод может ускорить процесс, но я не думаю! –

+0

@RThompson Я предлагаю проверить версию двойного «интеграла», которую я показал, если только это не было реализовано вами. –

+0

Метод, который я уже использовал, был вашим вариантом 1, я попробую двойную интегральную версию, чтобы узнать, работает ли она быстрее! –