В моем комментарии я имел в виду, что наивный
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) Вы можете написать свой собственный Erf
интегратор, используя что-то вроде
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]
Где, в конце, остальные интегралы передаются в Integrate
.Но вам нужно быть умнее в сопоставлении с образцом (возможно, включая некоторые преобразования в промежуточных шагах), чтобы поймать все Erf
-подобные функции.
2) Вы перезаписалиФункции типа Erf
, поэтому они никогда не вычисляют с помощью встроенных подпрограмм:
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]}
Где, очевидно, вы выбираете свои собственные соглашения для функций myErf
.
Редактировать: Самый простой и, возможно, самый безопасный / самый мягкий способ (благодаря Леониду) делать то, что вы хотите, это просто Block[{Erf=...},...]
и позволить интегратору Mathematica выполнить всю работу.Например, вам myErf
присвоили
In[1]:= myErf[x] == Integrate[Exp[-y^2/2], {y, -Infinity, x}]
Out[1]= myErf[x]==Sqrt[Pi/2] (1+Erf[x/Sqrt[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])
Редактировать 2: Возможновам просто нужно уметь переводить выражения в myErf
и обратно.Это означает, что он не будет автоматическим, но он будет гибким.Попробуйте
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]
Обратите внимание, что команда FunctionExpand
предназначена для перезаписи Erfc[x]
как 1-Erf[x]
.Возможно, вы захотите реализовать эту часть немного лучше.