2016-07-17 2 views
0

제 표현식 (최종 평가 후)은 매우 복잡한 정수 표현으로 밝혀졌습니다. 함수 내에서 역함수를 포함합니다.Matlab에서 정수 표현식을 수치로 변환합니다.

저는 이것을 해결하기 위해 상징적 인 함수를 사용하고 있습니다. 불행히도 나는 필요한 표현의 관점에서 대답을 얻을 수 없었다. 누군가 나를 인도 할 수 있습니까?

다음은 제 코드입니다.

dn=2; 
    pfa = .1; 
    dref = 1; 

    syms x z 
    lo_x_lim = erfinv(pfa-1)*sqrt(2); 
    hi_x_lim = inf; 

    lo_z_lim = 0 
    hi_z_lim = dn 

    %% Expression 

    Q(x,z) = .5 +.5*erf(x/sqrt(2)) 
    Qinv_ = erfinv(Q - pfa/2) %Note that this need to be changed 
    f_step_2 = (Qinv_ - x)/(1-z/dref) 
    f_step_3 = Q(f_step_2,0) 

    g(x,z) = 2*z/dn^2 
    h(x,z) = exp(-x^2/2) 

    %combining three equations to form one 
    fin = f_step_3*g*h 

    % Doing double integral wrt x and z in two steps 
    %integrate wrt x 
    int_x = int(fin,x,-0.2,hi_x_lim) 

    %integrate wrt z 

    int_z = int(int_x,z,lo_z_lim,hi_z_lim) 

다음은 최종 답변입니다. (부동 소수점 형식으로 표현해야 함).

int_z = 

int(int((z*exp(-x^2/2)*(erf((2^(1/2)*(x - erfinv(erf((2^(1/2)*x)/2)/2 + 9/20)))/(2*(z - 1)))/2 + 1/2))/2, x, -.2, Inf), z, 0, 2) 

답변

2

일반적으로 심볼릭 연산은 가능한 정확한 답변을 유지하기 위해 노력합니다. 확실한 적분의 경우, 이는 엔진이 적분 함수의 반 미분을 찾아 통합 범위에서 평가해야 함을 의미합니다. 안티 파생 상품을 찾을 수 없다면, 엔진은 에러/경고 또는 Matlab Symbolic Toolbox 및 기타 엔진의 경우 "it just returns int(f)"을 던질 수 있습니다. 그러나 intdouble을 사용하여 확정적 적분에 대한 수치 근사값을 반환하도록 할 수 있습니다. 최종 행을

int_z = double(int(int_x,z,lo_z_lim,hi_z_lim)); 

으로 변경하면 수치 근사값이 산출됩니다. 그러나 피고 합의의 복잡성으로 인해 상당히 오랜 시간이 걸립니다. 내가 계속해서 비누 상자에 대해 좋아하는 것처럼, 당신이 숫자를 찾고 있다면, 아마 마지막에 숫자를 사용하고 싶을 것이다. 수정 된 코드 출력을

int_z = 
    0.6957 
Elapsed time is 841.910756 seconds. 
int_z_num = 
    0.6957 
Elapsed time is 0.219571 seconds. 
+0

감사를 실행

fin_num = matlabFunction(fin,'Vars',[x,z]); int_z_num = integral2(fin_num,-0.2,hi_x_lim,lo_z_lim,hi_z_lim); 

: integral2를 사용하여 직접 수치 근사값을 고려하십시오. 도움이됩니다. 또한 나를 위해 그것은 많은 시간을 들이지 않았다. 8G RAM이 장착 된 Windows 7을 사용하고 있습니다. 이것이 저속 처리의 이유 일 수 있습니다. 그러나 감사의 짐 – Sjaffry

+0

@Sjaffry 기쁜 그것이 작용한다. 호기심에서 상징적 인 수치 계산의 실행 시간은 무엇입니까? – TroyHaskin

+0

나는 그것을 계산하지 않았습니다. 거의 없기 때문에. 거의 마우스 버튼을 클릭 한 후 !!! – Sjaffry

관련 문제