순진한
Unprotect[Integrate];
Integrate[Exp[-y_^2], {y_, -\[Infinity], x_}] := myErf[x]
작동하지 않는 일부 Integrate
평가를 차단하려고하는 것입니다.
사실이
In[]:= Integrate[Exp[-y^2],{y,-Infinity,z}]
Out[]= myErf[z]
(즉 자정에 SO 질문에 대답 나를 가르 칠 것입니다) 작업 않습니다. 그러면 아래 주어진 myIntegrate
함수가 필요하지 않을 수 있습니다.
어쨌든 ... 코멘트에 주어진 두 가지 대안은 다음과 같습니다
가
1) 당신은 어디 말에
In[1]:= myErf[x_?NumericQ]:=NIntegrate[Exp[-y^2],{y,-\[Infinity],x}]
(* sames as Erf up to constant and scaling *)
In[2]:= Clear[myIntegrate]
myIntegrate[a_. Exp[b_. y_^2], {y_, -\[Infinity], x_}] /; FreeQ[{a, b}, y] := ConditionalExpression[myErf[x], b < 0]
myIntegrate[a_. Exp[b_. y_^2], {y_, xx_, x_}] := myIntegrate[a Exp[b y^2], {y, -\[Infinity], x}] - myIntegrate[a Exp[b y^2], {y, -\[Infinity], xx}]
myIntegrate[a_ + b_, lims__] := myIntegrate[a, lims] + myIntegrate[b, lims] (* assuming this is ok *)
myIntegrate[expr_, lims__] := Integrate[expr, lims]
In[8]:= myIntegrate[a Exp[x]+b Exp[-b x^2],{x,2y,z}]
Out[8]= ConditionalExpression[a (-E^(2 y)+E^z) - myErf[2 y] + myErf[z], b > 0]
같은 자신의 Erf
통합하여 뭔가를 쓸 수, 나머지 적분 값은 Integrate
으로 전달됩니다. 그러나 모든 Erf
과 같은 기능을 잡으려면 패턴 매칭 (더 잘 어울리는 중간 단계에서의 변형을 포함)에서 더 똑똑해야합니다. 그들은 내장 루틴을 사용하여 평가하지 않도록
2) 당신은 Erf
타입 기능을 덮어 쓰기 : 분명히, 당신은 myErf
기능에 대한 자신의 규칙을 선택
In[9]:= Clear[myErf];
Unprotect[Erf,Erfc,Erfi];
In[10]:= Erf[x__] := myErf[x]
Erfc[x__]:= myErfc[x]
Erfi[x__]:= myErfi[x]
In[13]:= {Erf[1], Erfc[2], Erfi[\[Pi]], Integrate[E^-x^2,x]}
Out[13]= {myErf[1], myErfc[2], myErfi[\[Pi]], 1/2 Sqrt[Pi] myErf[x]}
.
는
편집 : 당신이 원하는 일을 간단하고 어쩌면 가장 안전한/부드러운 방법 (레오 니드 덕분에) 단지 Block[{Erf=...},...]
및 매스 매 티카 통합이 모든 작업을 수행하는 것입니다.예를 들어 는 당신 myErf
2
In[2]:= Block[{Erf = (Sqrt[2/Pi]*myErf[Sqrt[2] #] - 1 &)},
Integrate[Exp[-y^2 + y/2], {y, x, Infinity}]]
Out[2]= (E^(1/16)(Sqrt[\[Pi]] (-1 + 4 x + Sqrt[(-1 + 4 x)^2]) +
Sqrt[2] (1 - 4 x) myErf[Sqrt[2] Sqrt[(-(1/4) + x)^2]])
)/(2 Sqrt[(1 - 4 x)^2])
편집, 그래서 원래의 게시물에 적분을 해결하기 위해
In[1]:= myErf[x] == Integrate[Exp[-y^2/2], {y, -Infinity, x}]
Out[1]= myErf[x]==Sqrt[Pi/2] (1+Erf[x/Sqrt[2]])
으로 주어졌다 :이 어쩌면 당신은 그냥 번역 할 수 있어야합니다 ~에서 myErf
표현. 이것은 자동이 아니지만 융통성이 있음을 의미합니다. FunctionExpand
명령 1-Erf[x]
로 Erfc[x]
을 다시 작성 있다는 것을
In[1]:= toMyErf=(FunctionExpand[#]/.Erf:>(Sqrt[2/Pi]*myErf[Sqrt[2] #]-1&)&);
fromMyErf=(#/.myErf:>(Sqrt[Pi/2] (1+Erf[#/Sqrt[2]])&)&);
In[3]:= Integrate[Exp[-y^2+y/2],{y,x,Infinity}]//toMyErf
Out[3]= 1/2 E^(1/16) Sqrt[\[Pi]] (2-Sqrt[2/\[Pi]] myErf[Sqrt[2] (-(1/4)+x)])
In[4]:= D[x*myErf[x+x^2],x]//fromMyErf//toMyErf
Out[4]= E^(-(1/2) (x+x^2)^2) x (1+2 x)+myErf[x+x^2]
참고하십시오. 약간 더 나은 부분을 구현하는 것이 좋습니다.
죄송합니다. 귀하가 찾고있는 대체물이 무엇인지 알 수 없습니다. 원하는 결과를 게시 할 수 있습니까? –
필자는 (쉽게) "Integrate"의 동작을 재정의하는 것이 가능하다고 생각하지 않습니다. 내가 생각할 수있는 유일한 두 가지 옵션은 1) 'Erf'형의 integrand를 검색 한 후 나머지를 Integrate로 다시 전달하는 고유 한 통합 함수를 작성합니다. 2) mma의'Integrate'가 마술을 한 후에'Erf' 's를 붙잡고 다시 씁니다. – Simon
@ 사이먼 어쨌든, 내가 생각하는 어떤 접근 방식은 많은 구멍을 가지고 있습니다 ... –