2011-12-11 2 views
2

형태가 f(x,y)=Integrate(g(x,y,z),z from 0 to inf) 인 자체 함수를 작성해야합니다.intergral의 함수 인 matlab 함수

function y=f(x,y) 
[email protected](z)exp(-z.^2)./(z.^x).*(z.^2+y.^2).^(x/2);% as a function of x,y and z 
y=quadgk(g,0,inf) 

내가 f(x0,y0) 같은 단일 값을 호출하는 경우, 그것은 작동하지만 f([1:10],y0) 같은 것을 계산하려고하면 다음 오류 메시지가에 문제가 있다고 그래서 내가 사용하는 코드였다 시간과 차원. 원칙적으로 for 루프를 사용할 수는 있지만 코드가 느려지고 영원히 걸립니다. 내가 너희들에게서 얻을 수있는 도움이 있니? 또는 참조?

나는 for 루프를 사용하는 것보다 matlab에서 행렬 계산을 사용하는 것이 훨씬 빠르기 때문에 for 루프를 피하려고합니다. 이 기능을 활용할 수있는 트릭이 있는지 궁금합니다. 사전에 어떤 도움

감사합니다,

+0

귀하의 경우에는 for 루프를 사용해야한다고 생각합니다. 'x = 1 : 10'이라면 정상적인 함수보다 10 배 이상 걸리지 않을 것입니다. – Oli

+0

글쎄 만약 내가 문제가 아니에요 10 회 루프에 대한 할,하지만 난이 함수를 다른 함수에 전달할 필요가 몇 가지 최적화 할 및이 f 함수를 벡터 입력을 받아 들일 수 있어야하고 생산 벡터 출력 ... – user1092696

답변

0

은 아마 당신은 f([1:10]',y0)되는 행을 기반으로 값 대신 열을 생성 간격을 바꾸어 시도 할 수 있습니다. 그렇지 않으면 함수에있는 어떤 것이 잘못되었을 수 있습니다. 예를 들어 x^y을 목록으로 입력으로 사용하려면, x.^y의 접두어를 붙이십시오. 루프가 당신을 위해 문제가없는 경우

+0

답장을 보내 주셔서 감사합니다. 행과 열 벡터를 모두 사용해 보았습니다. 모든 * 및^및 /. 다음에 점을 넣어야합니다. 필자가 적어 둔 정확한 함수를 포함해야합니다. . – user1092696

0

.. mulitply 및 부문 내 생각에 같은, 당신이 그런 짓을해야합니다

function y2=f(x,y) 
y2=zeros(size(x)); 

for n=1:numel(x) 
    [email protected](z)exp(-z.^2)./(z.^x(n)).*(z.^2+y.^2).^(x(n)/2);% as a function of x,y and z 
    y2(n)=quadgk(g,0,inf) 
end 
+0

답장을 보내 주셔서 감사합니다. for 루프를 사용해 보았지만 내 코드를 실행하는 데 영원히 걸립니다. 이 함수는 내 프로젝트의 일부입니다.이 함수를 정의한 후에는 역 라플라스를 수행 한 다음 결과 함수를 최대화해야합니다 ... 그래서 matlab에 대해 행렬 계산을 수행하는 속도가 훨씬 빠르기 때문에 코드가 너무 느릴 때마다 루프를 사용하면 훨씬 빠릅니다 for 루프보다 약간의 트릭이 필요하다. 어쨌든, 고마워. – user1092696

0

여기서 문제는 quadk 자체가 g에 대한 인수로 벡터를 사용한다는 것입니다. 그런 다음 g와 같은 말은 z.^x과 같습니다.이 벡터는 z와 x가 같은 차원 인 경우에만 정의되는 두 벡터의 힘입니다. 그러나 이것은 당신이 원하는 것이 아닙니다.

모든 인수에 대한 함수를 x으로 평가하고 출력 벡터의 크기가 x 인 것으로 가정합니다. 그러나 이것은

[email protected](x)[x;x.^2] 
quad(g,0,1) 

이 작동하지 않는 경우에도이 간단한 예제부터 가능하지 않는 것 : quadgk를 사용하는 경우

Error using quad (line 79) 
The integrand function must return an output vector of the same length as the 
input vector. 

유사한 오류가 표시됩니다. 문서에서는 또한이 루틴은 스칼라 함수에만 적용되며 적응 쿼드 러처 규칙은 일반적으로 적분을 평가하기 위해 각 함수에 대해 다른 점을 사용하기 때문에 놀랄 일은 아니라고 말합니다.

대신 벡터 값이있는 함수를 통합 할 수있는 quadv을 사용해야합니다. 그러나 이것은 함수가 [0, \ infty] 간격으로 통합되기 때문에 잘못된 결과를 제공합니다.