Google ClassroomGoogle Classroom
GeoGebraGeoGebra Třída

偏微分を積分しよう

このワークシートはMath by Codeの一部です。 前回は、微分方程式の入門としてのかんたんな変数分離を扱いました。 今回は、方程式のタイプに応じた解法となる、基本的な視点をふやしてみよう。

全微分df=0。(6x+3y+5)dx+(3x-4y +3)dy=0

全微分df=0。(x^3+3xy^2)dx+(3x^2y+y^3)dy=0

1.完全形と積分因子

<完全形p(x,y)dx+q(x,y)dy=0> p(x,y)dx+q(x,y)dy=0の型が、 関数f(x,y)の全微分を使って、 df(x,y) =∂f/∂x dx +∂f/∂y dy =p(x,y) dx+q(x,y) dy=0 と表せる関数fがあるとき完全型という。 これは、関数fが連続な偏導関数を持ちfが一定なら全微分df=0となるという意味からきている。 完全形の解は陰関数f(x,y)=C(定数)。完全形が∂p/∂y=∂q/∂xは同値。 ∂f/∂x=p を両辺積分して、f= ∫p dx+c(y) ∂f/∂y=q を両辺積分して、f= ∫q dy+d(x) これから、∫pdx+c(y) = ∫qdy+d(x)= f となる、fを定める。 (例) 微分方程式dy/dx=-(6x+3y+5)/(3x-4y +3) 式変形した(6x+3y+5)dx+(3x-4y +3)dy=0をf(x,y)の全微分形式とみなす。 p=6x+3y+5, q=3x-4y +3とおくと、∂p/∂y=∂q/∂x=2だから、完全形。 ∫(6x+3y+5) dx +c = 3x2+(3y+5)x+c(y) =3x2+5x+3xy+c(y) =f ∫(3x-4y +3) dy +d = (3x+3)y-2y2+d(x) = d(x) +3xy-2y2 +3y =f この2式を満たす一般解はf(x,y)=3x2+5x+3xy-2y2 +3y=C 発想は少し高度かもしれないけれど、計算はとても簡単だね。 (別解) -(6x+3y+5)=3x-4y+3=0の解(x,y) =(-29/33, 1/11)を使って、 x=X-29/33, y=Y+1/11とおいて定数項を消して、変数分離型にもちこむ。 dY/dX=dy/dx=-11(6x+3y+5)/11(3x-4y+3)=-(66(X-29/33)+33(Y+1/11)+55)/(33(X-29/33)-44(Y+1/11)+33) =-(66X-58+33Y+3+55)/(33X-29-44Y-4+33)=-(66X+33Y)/(33X-44Y)=-(6X+3Y)/(3X-4Y) u=Y/XとおくとdY/dX=-(6+3(Y/X))/(3-4(Y/X))=(6+3u)/(4u-3)。 Y=Xuの両辺微分dY/dX=(Xu)'=u+X・du/dXからu+X・du/dX=(6+3u)/(4u-3)。 X/dX={(6+6u-4u2)/(4u-3)}/duから(4u-3)/2(3+3u-2u2) du=1/X dXと変数分離。   から、 となり、 だから、 3(x+29/33)2+3(x+29/33)(y-1/11)-2(y-1/11)2=C (C=0の場合も含む) 式を整理すると、 3x2+5x+3xy-2y2 +3y+D=C(D=Cの場合も含む) 発想は単純だけで、計算の手間が増えるね。 (例) 微分方程式dy/dx=-(x3+3xy2)/(3x2y+y3) 式変形した(x3+3xy2)dx+(3x2y+y3)dy=0をf(x,y)の全微分形式とみなす。 p=x3+3xy2, q=3x2y+y3とおくと、∂p/∂y=∂q/∂x=6xyだから、完全形。 ∫(x3+3xy2) dx+c= 1/4x4+1/2(3y2)x2+c(y) =1/4(x4+6x2y2+4c(y)) =f ∫(3x2y+y3) dy+d= 1/2(3x2)y2+1/4y4+d(x) =1/4( d(x) +6x2y2+y4) =f この2式を満たす一般解はf(x,y)=1/4(x4+6x2y2+y4)=C <積分因子> Pdx+Qdy=0が完全微分形でなくても、適当な式Mをかけて完全型になるときMを積分因子という。Mの求め方としては次のやり方がうまくいくときがある。 N=(Py-Qx)/Qがxだけの関数なら、M(x)=exp(∫Ndx) N=(Qx-Py)/Pがyだけの関数なら、M(y)=exp(∫Ndy) 他にP,Qのx、yの指数を見比べるMの指数を考えるなど。 (例) 微分方程式dy/dx=-(1-xy)/(xy-x^2) (1-xy)dx+(xy-x^2)dy=0に適当なMをかけて完全形にするためのMは? M=1/xとして、p=1/x-y, q=y-xとおくと、∂p/∂y=∂q/∂x=-1だから、完全形になった。 ∫(p) dx+c=log|x|+c(y) =f(x) ∫(q) dy+d= 1/2y2-yx+d(x)= =f(x) この2式を満たす一般解はf(x,y)=log|x|+1/2y2-xy=C

積分因子でdf=0。(1-xy)dx+(xy-x^2)dy=0

2.実装

質問:全微分形式の微分方程式をコードで解くにはどうしたらよいでしょうか。 sympyは陽関数の形式でのy'=f(x,y)の形で情報を与えると、陽関数の形式で返します。 全微分形式では、x、yのどちらが独立変数ということはないのですが、yがxの関数としてかいてみます。 y = Function('y') dy/dxをDerivative(y(x), x)とかきましょう。 [IN]======================================= from sympy import symbols, Eq, Function, dsolve x, y = symbols('x y') y = Function('y') # y=f(x) def dydxEq(fx): deq = Eq(y(x).diff(x), fx) return dsolve(deq, y(x),implicit=True) dydxEq(-(6*x+3*y(x)+5)/(3*x-4*y(x) +3)) [OUT]===================================== [Eq(y(x), 3*x/4 - sqrt(C1 + 35937*x**2 + 63162*x)/132 + 3/4), Eq(y(x), 3*x/4 + sqrt(C1 + 35937*x**2 + 63162*x)/132 + 3/4)] すごい係数になってしまい、陰関数で返すに指定しても陽関数で返されてしますます。 そこで、全微分形式で、f(x,y)=∫pdx + c(y)= ∫qdy + d(x)の考え方で、f(x,y)=Cを求めてみましょう。 fpdxと∫qsyの共通項はxとyの両方の変数をもつ項です。 だから、集合で考えると A=∫pdx=xのある項、 B=∫qdy=yのある項、 A∩B=xとyの両方ある項 だから、解の方程式はA∪B-A∩B=Cです。 #[IN]Python=============================== #全微分形式 p(x,y) dx + q(x,y) dy=0の解 from sympy import symbols, Eq, Function, dsolve, integrate import sympy def perfectDiff(p_xy,q_xy): # 積分変数を定義 x, y ,C= symbols('x y C') #p,qを積分して展開する px = integrate(p_xy, x).expand() qy = integrate(q_xy, y).expand() #多項式を合併する A=set(list(px.args)) B=set(list(qy.args)) poly=list(A.union(B)) return Eq(sum(poly),C) x, y ,C= symbols('x y C') p = 6*x+3*y+5 q = 3*x-4*y+3 perfectDiff(p,q) #[OUT]==================================
Image
#[IN]======================== p=x**3+3*x*y**2 q=3*x**2*y+y**3 perfectDiff(p,q) #[OUT]======================
Image
#==================== p=1/x-y q=y-x perfectDiff(p,q) #=====================
Image
<勾配(grad)> 惑星Jの東経x、北緯yの地点の山の高さをf(x,y)としましょう。 xを固定したときの山の断面でのy方向の勾配が∂/f∂x yを固定したときの山の断面でのx方向の勾配が∂f/∂yです。 山の斜面での最大傾斜線の傾きが全微分dfです。 df = ∂/f∂x dx+ ∂f/∂y dy x,y地点での微小ベクトルdr=(dx, dy)にたいして、 (∂/f∂x, ∂f/∂y)を勾配grad f演算といいます。 df = grad f drとベクトルの内積の結果 質問:fをz方向として、geogebraで3Dで山と各点でのdf=0の確認をするにはどうしたらよいでしょうか。 たとえば、冒頭の全微分の場合は、先に曲面の方程式を与えましょう f(x,y)=3x2+5x+3xy-2y2 +3y これが山fです。 Derivative(f, x)とすると、 ∂/f∂x=6x+3y+5が計算されます。これをp(x,y)とします。 Derivative(f, y)とすると、 ∂f/∂y=3x-4y +3が計算されます。これをq(x,y)とします。 山を水平に切るために、スライダーcを作ります。 z=cの数式だけで、高さcの水平面rができます。 IntersectionPaths(f,r)を使うと、交線eq1が図でかけます。 これって、山の等高線になっているね。 f(x,y)=cと同等な数式を入れると、山を切る交線としての曲線eq2ができますね。 これは、z座標が表面に出てこないので、xy平面(グラフィックビュー)の曲線になる。 曲線eq2にあるA点でベクトルdr=(dx,dy)を作り、それを動かすためのx座標をスライダーaxで作ります。 Solution(f(ax, y)=c,y)とすると、Aのy座標のリストysが得られます。 1つの交点で十分なので、ay=ys(1)とすると、1つめの交点のy座標を求めてくれます。 そこで、Aを(ax,ay)で定義しましょう。 m(x,y)=-p(x,y)/q(x,y)とおき、C=(ax+1, ay+m(ax,ay))とすることで、 dr=Vector(A,C)で接線の方向ベクトルとしての増分ベクトルdrができるね。 どうようにして、勾配ベクトルgrad fをつくります。 D=(ax+p(ax,ay), ay+q(ax,ay))として、gradf=Vector(A,D)とします。 内積gradf *dr=0なら、 df = ∂/f∂x dx+ ∂f/∂y dy=0 となります。 グラフィックビューで2つのベクトルが直交するのが確認できますね。 また、gradf ベクトルが相当でかいので、山というより断崖絶壁のような勾配になっているのことも 感じられるでしょう。 このように、f(x,y)を基点にして、数式を連携させると、 f(x,y)の式を変えるだけで、すべてが連動して変わりますね。

f(x,y)=3x^2+5x+3xy-2y^2 +3yの勾配grad

f(x,y)=1/4(x4+6x2y2+y4)の勾配grad

f(x,y)=log|x|+1/2y^2-xyの勾配grad