複素関数論の応用
平成20年11月14日
本テキストでは、複素関数論の基礎を既知として、複素解析の具体的な応 用のいくつかを紹介する(計算機による実験を含む)。
目 次
1 複素数演算 3
1.1 四則演算 . . . . 3
1.2 複素関数 . . . . 3
1.3 演習(複素数と関数値) . . . . 11
2 複素数関数の可視化 11 2.1 初等関数の視覚化 . . . . 11
2.1.1 多項式関数 . . . . 12
2.1.2 分数関数. . . . 16
2.1.3 指数関数. . . . 16
2.1.4 対数関数. . . . 16
2.1.5 三角関数. . . . 17
2.1.6 逆三角関数 . . . . 17
2.2 等角写像. . . . 17
2.3 演習(複素関数の可視化) . . . . 18
3 2次元流体力学 18 3.1 非圧縮性流体の方程式 . . . . 18
3.2 単一の流れ . . . . 20
3.2.1 一様な流れ . . . . 20
3.2.2 わき出しと吸い込み . . . . 22
3.2.3 渦糸 . . . . 22
3.3 重ねあわせから得られる流れ. . . . 23
3.3.1 一様流とわき出し. . . . 23
3.3.2 わき出しすいこみ対 . . . . 24
3.3.3 渦対 . . . . 24
3.3.4 一様流とわき出しすいこみ対 . . . . 25
3.4 わき出し口とすいこみ口の極限的一致から得られる流れ . . . . 25
3.4.1 2重わき出し . . . . 26
3.4.2 4重わき出し . . . . 26
3.4.3 一様流と2重わき出し . . . . 27
3.5 角をまわる流れ . . . . 27
3.6 速度ベクトル場 . . . . 28
3.7 合成関数による流れ . . . . 29
3.7.1 関数の合成により保存されること . . . . 30
3.7.2 リーマンの写像定理 . . . . 30
3.7.3 円の内部を上半平面への変換 . . . . 30
3.7.4 平板の外部から円の外部への変換 . . . . 31
3.7.5 飛行機の翼 . . . . 32
3.8 演習(流体力学) . . . . 34
4 数値解析特論 34 4.1 関数の補間 . . . . 35
4.1.1 ラグランジュ補間. . . . 35
4.1.2 チェビシェフ補間. . . . 37
4.1.3 誤差について . . . . 39
4.2 数値積分法 . . . . 40
4.2.1 補間型積分公式 . . . . 40
4.2.2 ニュートンコーツの公式 . . . . 41
4.2.3 ガウス型公式 . . . . 47
4.2.4 台形則とその特徴. . . . 50
4.2.5 変数変換型数値積分公式 . . . . 55
4.2.6 DE公式 . . . . 56
4.2.7 数値積分の誤差評価 . . . . 62
4.3 演習(数値解析) . . . . 67
5 この講義で参考にしたもの 68
1 複素数演算
1.1 四則演算
まず複素数の基本的な演算を復習する。
偏角はargz= arctany
xとなる。
z1=x1+iy1,z2=x2+iy2に対して加減は
z1±z2= (x1±x2) +i(y1±y2) 乗算は
z1z2= (x1x2−y1y2) +i(x1y2+x2y1) 除算は
z1 z2
= (x1x2+y1y2)
x22+y22 +i(y1x2−x1y2) x22+y22 となる。
1.2 複素関数
次に複素関数を復習する。
指数関数はz=x+iyに対して
exp(z) = exp(x+iy) =ex(cosy+isiny) 対数関数はz=reiθ に対して
log(z) = logr+iθ ここで
r=√
x2+y2, θ= arctany x 三角関数は
sinz=eiz−e−iz
2i ,cosz=eiz+e−iz
2 ,tanz= sinz cosz 双曲線関数は
sinhz=ez−e−z
2 ,coshz=ez+e−z
2 ,tanhz= sinhz coshz を用いると
sin(x+iy) = sinxcoshy+icosxsinhy cos(x+iy) = cosxcoshy−isinxsinhy sinh(x+iy) = sinhxcosy+icoshxsiny
cosh(x+iy) = coshxcosy+isinhxsiny が得られるので実関数で実部と虚部を計算することができる。
平方根は
√x+iy=√
r(cos(θ/2) +isin(θ/2)) =
√r+x
2 +
√r−x 2 累乗はをつぎを利用する。
zα= exp(αlogz)
以上を考慮して奥村氏が作成したプログラムに若干手を加えたもの以下の
complex.cである。本質的なルーチンには変更を加えていない。
/***********************************************************
complex.c -- 複素数の四則と初等複素関数
***********************************************************/
typedef struct { double re, im; } complex; /* 複素数型 */
complex c_conv(double x, double y) /* $x$, $y$ を複素数 $z = x + iy$ に 変換 */
{
complex z;
z.re = x; z.im = y;
return z;
}
char *c_string(complex z) /* 複素数 $z = x + iy$ を文字列に変換 */
{
static char s[40];
sprintf(s, "%g%+gi", z.re, z.im);
return s;
}
complex c_conj(complex z) /* 共役複素数 $\overline{z}$ */
{
z.im = - z.im;
return z;
}
double c_abs(complex z) /* 絶対値 $|z|$ */
{
double t;
if (z.re == 0) return fabs(z.im);
if (z.im == 0) return fabs(z.re);
if (fabs(z.im) > fabs(z.re)) { t = z.re / z.im;
return fabs(z.im) * sqrt(1 + t * t);
} else {
t = z.im / z.re;
return fabs(z.re) * sqrt(1 + t * t);
} }
double c_arg(complex z) /* 偏角 ($-\pi \le \varphi \le \pi$) */
{
return atan2(z.im, z.re);
}
complex c_add(complex x, complex y) /* 和 $x + y$ */
{
x.re += y.re;
x.im += y.im;
return x;
}
complex c_sub(complex x, complex y) /* 差 $x - y$ */
{
x.re -= y.re;;
x.im -= y.im;
return x;
}
complex c_mul(complex x, complex y) /* 積 $xy$ */
{
complex z;
z.re = x.re * y.re - x.im * y.im;
z.im = x.re * y.im + x.im * y.re;
return z;
}
#if 0
complex c_div(complex x, complex y) /* 商 $x / y$ (単純版) */
{
double r2;
complex z;
r2 = y.re * y.re + y.im * y.im;
z.re = (x.re * y.re + x.im * y.im) / r2;
z.im = (x.im * y.re - x.re * y.im) / r2;
return z;
}
#endif
complex c_div(complex x, complex y) /* 商 $x / y$ (上位桁あふれ 対策版) */
{
double w, d;
complex z;
if (fabs(y.re) >= fabs(y.im)) {
w = y.im / y.re; d = y.re + y.im * w;
z.re = (x.re + x.im * w) / d;
z.im = (x.im - x.re * w) / d;
} else {
w = y.re / y.im; d = y.re * w + y.im;
z.re = (x.re * w + x.im) / d;
z.im = (x.im * w - x.re) / d;
}
return z;
}
complex c_exp(complex x) /* 指数関数 $e^x$ */
{
double a;
a = exp(x.re);
x.re = a * cos(x.im);
x.im = a * sin(x.im);
return x;
}
complex c_log(complex x) /* 自然対数 */
{
complex z;
z.re = 0.5 * log(x.re * x.re + x.im * x.im);
z.im = atan2(x.im, x.re);
return z;
}
complex c_pow(complex x, complex y) /* 累乗 */
{
return c_exp(c_mul(y, c_log(x)));
}
complex c_sin(complex x) /* 正弦 $ */
{
double e, f;
e = exp(x.im); f = 1 / e;
x.im = 0.5 * cos(x.re) * (e - f);
x.re = 0.5 * sin(x.re) * (e + f);
return x;
}
complex c_cos(complex x) /* 余弦 */
{
double e, f;
e = exp(x.im); f = 1 / e;
x.im = 0.5 * sin(x.re) * (f - e);
x.re = 0.5 * cos(x.re) * (f + e);
return x;
}
complex c_tan(complex x) /* 正接 */
{
double e, f, d;
e = exp(2 * x.im); f = 1 / e;
d = cos(2 * x.re) + 0.5 * (e + f);
x.re = sin(2 * x.re) / d;
x.im = 0.5 * (e - f) / d;
return x;
}
complex c_sinh(complex x) /* 双曲線正弦 */
{
double e, f;
e = exp(x.re); f = 1 / e;
x.re = 0.5 * (e - f) * cos(x.im);
x.im = 0.5 * (e + f) * sin(x.im);
return x;
}
complex c_cosh(complex x) /* 双曲線余弦 */
{
double e, f;
e = exp(x.re); f = 1 / e;
x.re = 0.5 * (e + f) * cos(x.im);
x.im = 0.5 * (e - f) * sin(x.im);
return x;
}
complex c_tanh(complex x) /* 双曲線正接 */
{
double e, f, d;
e = exp(2 * x.re); f = 1 / e;
d = 0.5 * (e + f) + cos(2 * x.im);
x.re = 0.5 * (e - f) / d;
x.im = sin(2 * x.im) / d;
return x;
}
#define SQRT05 0.707106781186547524 /* $\sqrt{0.5}$ */
complex c_sqrt(complex x) /* 平方根 $\sqrt{x}$ */
{
double r, w;
r = c_abs(x);
w = sqrt(r + fabs(x.re));
if (x.re >= 0) {
x.re = SQRT05 * w;
x.im = SQRT05 * x.im / w;
} else {
x.re = SQRT05 * fabs(x.im) / w;
x.im = (x.im >= 0) ? SQRT05 * w : -SQRT05 * w;
}
return x;
}
実際の計算は次のようなプログラムを書く。
/***********************************************************
csisoku.c -- 複素数の四則
***********************************************************/
#include <stdio.h>
#include <math.h>
#include "complex.c"
int main() {
double x1, y1,x2,y2;
complex z1,z2,z3;
x1=1;y1=2;x2=2;y2=3;
z1 = c_conv(x1, y1);
z2 = c_conv(x2, y2);
printf("z1 = %s\n", c_string(z1));
printf("z2 = %s\n", c_string(z2));
z3=c_conj(z1);
printf("conjugate of z1= %s\n", c_string(z3));/*共役*/
printf("rorm of z1= %f\n", c_abs(z1));/*絶対値*/
printf("argument of z1= %f\n", c_arg(z1));
z3=c_add(z1,z2);
printf("z1+z2 = %s\n", c_string(z3));/*和*/
z3=c_sub(z1,z2);
printf("z1-z2 = %s\n", c_string(z3));/*差*/
z3=c_mul(z1,z2);
printf("z1*z2= %s\n", c_string(z3));/*積*/
z3=c_div(z1,z2);
printf("z1/z2= %s\n", c_string(z3));/*除*/
}
/***********************************************************
function.c 複素数の初等関数
***********************************************************/
#include <stdio.h>
#include <math.h>
#include "complex.c"
int main() {
double x, y,u,v;
complex z,w,a;
x=1;y=2;/*z=x+iy*/
u=0;v=1;/*a=u+iv*/
z = c_conv(x, y);
a = c_conv(u, v);
printf("z = %s\n", c_string(z));
printf("a = %s\n", c_string(a));
/***************************************/
w = c_exp(z);
printf("exp(z) = %s\n", c_string(w));
w = c_log(z);
printf("log(z) = %s\n", c_string(w));
w = c_sin(z);
printf("sin(z) = %s\n", c_string(w));
w = c_cos(z);
printf("cos(z) = %s\n", c_string(w));
w = c_tan(z);
printf("tan(z) = %s\n", c_string(w));
w = c_sinh(z);
printf("sinh(z) = %s\n", c_string(w));
w = c_cosh(z);
printf("cosh(z) = %s\n", c_string(w));
w = c_sqrt(z);
printf("sqrt(z) = %s\n", c_string(w));
w = c_pow(z,a);
printf("z^a= %s\n", c_string(w));
}
以上で複素関数の値を調べることができるようになった。これは最後の数値 積分の誤差評価のときに用いることになるであろう。
1.3 演習(複素数と関数値)
前説のcsisoku.c,function.cを実行させ、実際に複素数の値と複素関数の値 を求めてみよ。
プログラムの実行のさせ方
Cプログラムがcsisoku.cとする(function.cについても同様)。
∗ ∗ ∗>gcc -lm function.c
2 複素数関数の可視化
複素数関数の値が計算できるようになったので、次に複素初等関数を可視 化することにより深く関数の行動を理解しよう。理論を復習し、Cプログラ ムを作成実行しデータを計算し、gnuplotでグラフを描く。
2.1 初等関数の視覚化
一般に複素関数w=f(z)が与えられたとする。
z=x+iy,w=u+ivと書くと、f(x+iy) =u(x, y) +iv(x, y)と実部虚 部に分けて表示するとu=u(x, y), v=v(x, y)なる関係式がでてくる。また、
z平面を極座標表示するとz=reiθよりf(reiθ) =u(r, θ) +iv(r, θ) と実部 虚部に分けて表示すると、u=u(r, θ), v=v(r, θ)なる関係式が得られる。
ガウス平面上で複素数を考えると複素関数は2次元から2次元への写像で あり、これに対してグラフを描くことを考えると、4次元のグラフを描くこ
とになるが、これは難しい。従って、何らかの工夫をすることにより、可視 化することになろう。そこで上の表示式を利用して、z平面において各変数 の一方を固定し、像曲線を描くことにする。これらの曲線群を眺めることに より、複素関数の行動を観察していく。
以下この節で考察する問題は共通して以下である。
f(z)に対してu(x, y), v(x, y), u(r, θ), v(r, θ)をそれぞれ求め、次の各問に 答えよ。
• (1)xが一定のとき、(u(x, y), v(x, y))が描く曲線を求めよ。
• (2)yが一定のとき、(u(x, y), v(x, y))が描く曲線を求めよ。
• (3)rが一定のとき、(u(r, θ), v(r, θ))が描く曲線を求めよ。
• (4)θが一定のとき、(u(r, θ), v(r, θ))が描く曲線を求めよ。
• (5)u(x, y)が一定のとき、(x, y)が描く曲線を求めよ。
• (6)v(x, y)が一定のとき、(x, y)が描く曲線を求めよ。
注意
(5),(6)はf(z)の逆関数に対して(1),(2)を考えることと同じことである。
2.1.1 多項式関数
w=f(z) =z2について考える。
実際にこれらのグラフを描くことを考えてみる。
Cプログラムはグラフとなる基礎データを計算させることに用い、実際の グラフの描画はgnuplotなるグラフソフトに任せる。
以下のプログラムsqr1.cは設問の(1),(2)に答えたものである。
#sqr1.c
#include <stdio.h>
#include <math.h>
#define pai 3.141592653589793/*必要なとき使用する*/
/*複素数関数を描き、データをgnuplotに渡す*/
/*gcc -lm sqr1.cでコンパイルし、./a.out > test.dat*/
/*gnuplotで load "view.gp" */
/*関数 f(z)=z*z */
double funcf(double x, double y)/*f(z)の実部*/
{
return x*x -y*y;
}
double funcg(double x, double y)/*f(z)の虚部*/
{
return 2*x*y;
}
/*xを一定としたときの像の描く曲線群の関数*/
double conf_x(double xl, double xr,double yl,double yr, double xstep, double ystep) {
double x,y;
for(x=xl;x<=xr;x=x+xstep) {
for(y=yl;y<=yr;y=y+ystep)
printf("%f\t%f\n",funcf(x,y),funcg(x,y));
printf("\n");
} }
/*yを一定としたとき、像の描く曲線群の関数*/
double conf_y(double xl, double xr,double yl,double yr, double xstep, double ystep) {
double x,y;
for(y=yl;y<=yr;y=y+ystep) {
for(x=xl;x<=xr;x=x+xstep)
printf("%f\t%f\n",funcf(x,y),funcg(x,y));
printf("\n");
} }
/*************************************************************************/
int main() {
double xl=-1,xr=1;
double yl=-1,yr=1;
double xstep=0.1,ystep=0.1;
conf_x(xl, xr,yl,yr, xstep,ystep);
conf_y(xl, xr,yl,yr, xstep,ystep);
}
/*************************************************************************/
以下のプログラムsqr2.cは設問の(3),(4)に答えたものである。
#sqr2.c
#include <stdio.h>
#include <math.h>
#define pai 3.141592653589793/*必要なとき使用する*/
/*複素数関数を描き、データをgnuplotに渡す*/
/*gcc -lm sqr2.cでコンパイルし、./a.out > test.dat*/
/*gnuplotで load "view.gp" */
/*関数 f(z)=z*z */
/*極座標*/
double funcf(double x, double y)/*f(z)の実部*/
{
return x*x*cos(2*y);
}
double funcg(double x, double y)/*f(z)の虚部*/
{
return x*x*sin(2*y);
}
/*xを一定としたときの像の描く曲線群の関数*/
double conf_x(double xl, double xr,double yl,double yr, double xstep, double ystep) {
double x,y;
for(x=xl;x<=xr;x=x+xstep) {
for(y=yl;y<=yr;y=y+ystep)
printf("%f\t%f\n",funcf(x,y),funcg(x,y));
printf("\n");
} }
/*yを一定としたとき、像の描く曲線群の関数*/
double conf_y(double xl, double xr,double yl,double yr, double xstep, double ystep) {
double x,y;
for(y=yl;y<=yr;y=y+ystep) {
for(x=xl;x<=xr;x=x+xstep)
printf("%f\t%f\n",funcf(x,y),funcg(x,y));
printf("\n");
}
}
/*************************************************************************/
int main() {
double xl=0,xr=1;
double yl=0,yr=pai;
double xstep=0.1,ystep=yr/20;
conf_x(xl, xr,yl,yr, xstep,ystep);
conf_y(xl, xr,yl,yr, xstep,ystep);
}
/*************************************************************************/
次は設問(5),(6)に答えるためのgnuplot のスクリプトである。
#sqr.gp
set nologscale set noparametric set time
set title ’root of z’
set xlabel ’’
set ylabel ’’
set zlabel ’’
set view 0,0,1,1.5 set isosamples 30 set nohidden3d set contour base set nosurface
set cntrparam levels 17
set cntrparam levels incremental -2.0, 0.25 i={0.0,1.0}
f(x,y)=(x+i*y)*(x+i*y)
splot [-2.5:2.5][-2.5:2.5] real(f(x,y)), imag(f(x,y)) set isosamples 10
問
(1)sqr1.c,sqr2.c,sqr.gpを実際に実行してみよ。
(2)w = f(z) = z2 はz = reiθ とおくとw = f(z) = r2e2iθ であり、
0 ≤ θ < πでw平面を覆ってしまう。すなわち上半平面と全平面が対応し
ている。同様にz平面の下半平面はやはりw平面を覆う。これをプログラム
sqr2.cを改造し実行することにより視覚的に確認せよ。
(3)f(z) =z3のときをsqr1.c,sqr2.c,sqr.gpを改造してグラフを描いてみよ。
プログラムの実行のさせ方
Cプログラムがsqr1.cとする(sqr2.cについても同様)。
∗ ∗ ∗>gcc -lm sqr1.c
∗ ∗ ∗>./a.out>test.dat gnuplot >load ”view.gp”
が一連の手順である。
スクリプトsqr.gpは次の手順で実行させる。
gnuplot >load ”sqr.gp”
2.1.2 分数関数
w=f(z) = 1zについて考える。
問
(1)bunsu1.c,bunsu2.c,bunsu.gpを実際に実行してみよ。
(2)f(z) = 1zはz=reiθとおくとw=f(z) =r−1e−iθとなるので、関数の 動きがだいたい解る。z平面の単位円内はw平面の単位円外に写り、z平面 の単位円外はw平面の単位円内に写っている。またz平面での同心円の動き とw平面での同心円の動きは逆になっている。以上のことをbunsu2.cを改 造することにより視覚的に確認せよ。
f(z) =z+1zのときをbunsu1.c,bunsu2.c,bunsu.gpを改造してグラフを描 いてみよ。
2.1.3 指数関数
w=f(z) = expzについて考える。
問
(1)exp1.c,exp2.c,exp.gpを実際に実行してみよ。
(2)f(z) = expzは周期2πiを持っている。このことをexp1.cを改造する ことにより確認せよ。
2.1.4 対数関数
w=f(z) = logzについて考える。
問
(1)log1.c,log2.c,log.gpを実際に実行してみよ。
(2)f(z) = logzは定義はz=reiθに対して、logz= log(reiθ) = logr+iθ であった。これによりz平面を全て動いたとしてもw平面では細長い帯状の
領域しか動けない。このこをlog2.cを改造することにより視覚的に確認せよ。
これを考慮してlogzのリーマン面について復習せよ。
2.1.5 三角関数
w=f(z) = sinzについて考える。
問
(1)sin1.c,sin2.c,sin.gpを実際に実行してみよ。
(2)sinz=eiz−e−z
2i であった。このことからsinzは有界関数ではないこ とがわかるが、このことをsin1.cを改造することにより視覚的に確認せよ。
f(z) = coszに対してsin1.c,sin2.c,sin.gpを改造してグラフを描いてみよ。
2.1.6 逆三角関数
w=f(z) = arctanzについて考える。
z= tanwが逆関数w= arctanzの定義と言える。この関数について最初 の問題(1),(2)に答えるためにはtanw=zより、z=a+ibと置くことによ り、<tanw=aおよび=tanw=bのwの曲線を描けば良いことになる。し たがって、<tanwと=tanwの等高線を描かせることができればよい。
問
(1)arctan.gpを実行することにより、上が実現できていることを確認せよ。
(2)arctan.gpを改造し、w=f(z) = arccoszに対し最初の問題(1),(2)に 答えるグラフを描いてみよ。
2.2 等角写像
等角性とは次のことを言う。
領域Dで連続な複素関数f(z)が点z0∈Dで次の性質を持っているとき、
f(z)はz0において等角(conformal)であるという。
(1)z0で接線をもつ全ての曲線はw=f(z)によってw平面の点w0= f(z0)をとおり、そこで接線を持つ曲線に写像される。
(2)z0で接線をもつ2つの曲線がz0でなす角と、その像曲線がw0でな す角とが、大きさ、向き、ともに等しい。
このとき次の定理が成立している。
Theorm 1 複素関数f(z)が点z0で微分可能で、f0(z0) 6= 0であるとき、
f(z)は点z0で等角である。
例えばf(z) =z2を考えてみると,f0(z) = 2zであるから、この定理より原 点以外では等角であることが解る。x=c,y =dは直交する直線であるがこ れはそれぞれ放物線に写されることを確かめた。実際に等角であるかどうを 理論的に確かめてみよ。
問
(1)いままで考察してきた各複素関数が等角で無い点を考察せよ。
(2)今まで見てきたプログラムから等角性が読み取れることを実際に実行 して確認せよ。
2.3 演習(複素関数の可視化)
プログラムを全て実行させ、実際にグラフを描くことにより、複素関数の 振る舞いを視覚的に観察せよ。
具体的な課題
• sqr1.c,sqr2.c,sqr.gpをf(z) =z3に対して、改造し観察せよ。
• bunsu2.cをf(z) =z+1
z に対して、改造し観察せよ。
3 2次元流体力学
2次元非圧縮性流体は複素関数と密接な関連がある。流体の流れは複素関 数を用いて表示でき、その像の虚部が一定である複素平面の曲線が流線を表 し、実部が一定である複素平面の曲線が等ポテンシャル線を表している。こ こでは理論的にそのことを確認するとともに、基本的な流れ関数を考察する。
また実際に流線と等ポテンシャル線を描き、理論的な流れを可視化をとおし て深く理解する。
3.1 非圧縮性流体の方程式
物理学の講義ではないので流体の微分方程式の導出はここでは省略する。
さらに2次元の非圧縮性渦無しの流れに話を限定する。このとき、次のこと が知られている。
流体の流れの平面をx−y平面であるとする。点(x, y)における流体の速 度を(u(x, y), v(x, y))とする。
x−y平面上の曲線(x(t), y(t))が流線であるとはこの曲線の接線が速度ベ クトルに平行なときを言う。
このとき非圧縮性流体の連続の方程式は
∂u
∂x +∂v
∂y = 0 と書け、渦無しの条件は
∂v
∂x−∂u
∂y = 0
とかけるのである。渦無しの条件より、速度ポテンシャルΦが存在して、
u= ∂Φ
∂x, v=∂Φ
∂y
と書くことができる。また連続の方程式より、x, yの任意の関数Ψを用いて u= ∂Ψ
∂y, v=−∂Ψ
∂x
と表される。Ψ(x, y)は流れの関数と呼ばれている。いま(x(t), y(t))が流線 であるとする。このとき、Ψ(x(t), y(t))をtで微分すると、
dΨ(x(t), y(t))
dt =∂Ψ
∂xx0(t) +∂Ψ
∂yy0(t) = 0
となり、Ψは流線上で一定である。この意味でΨ(x, y)は流れの関数と呼ば れるのである。
今までの得られた式を並べ変えてみると u=∂Φ
∂x = ∂Ψ
∂y v=∂Φ
∂y =−∂Ψ
∂x
が得られ、これは既に学んだコーシーリーマンの方程式に他ならず、Φ +iΨ がz=x+iyの正則関数であることを示している。そこで
f(z) = Φ(x, y) +iΨ(x, y), z=x+iy
とおき、f(x)を複素速度ポテンシャルと呼ぶ。f(z)の両辺をxで偏微分す ると
f0(z)∂z
∂x =∂Φ
∂x +i∂Ψ
∂x ここで ∂z∂x= 1,∂∂xΦ=u, ∂Ψ∂x =−v に注意すると、関係
w=f0(z), w=u−iv
が得られる。このwを複素速度と呼ぶ。もともとの流体の速度ベクトルは (u, v)であったので、共役であるw¯が(u, v)を表していると言える。
f(z) = Φ(x, y) +iΨ(x, y)
であったのでΦ =<f(z),Ψ ==f(z)となり<f(z),=f(z)の等高線がそれぞ れ等ポテンシャル線と流線となる。
ここで等ポテンシャル線と流線が互いに直交していることを確認する。等 ポテンシャル線と流線が成す曲線の法線ベクトルは
(∂Ψ
∂x,∂Ψ
∂y),(∂Φ
∂x,∂Φ
∂y)
に平行である。ところで、コーシーリーマンの関係式より
∂Ψ
∂x
∂Φ
∂x +∂Ψ
∂y
∂Φ
∂y = 0
が成立しているので、法線ベクトルは直交する。従って、もとの曲線も直 交するのである。
3.2 単一の流れ
最も基本的な流れを考察する。
3.2.1 一様な流れ
U >0, αは実数として、次の関数で表されるふたつの流れを考える。
f(z) =U z, f(z) =U e−iαz
複素速度はw=U, w=U e−iαであるので、それぞれ速度ベクトルは一定 である。
f(z) =U zについて考える。z=x+iyであるので、
Ψ =U x,Φ =U y
であり、等ポテンシャル線と流線は それぞれ、y軸およびx軸に平行な直線 となる。
問
(1)f(z) =U e−iαzの等ポテンシャル線と流線はどのような曲線を描くか。
(2) gnuplotの一様流スクリプトpotent1.gp,flow1.gpをgnuplotで実行さ せて実際に等ポテンシャル線と流線を描いてみよ。
potent1.gpは以下の内容である。単に2次元のグラフの<f(x+iy)の等高 線を描かせているだけである。
set nologscale set noparametric set time
set title ’Re(f(z))=const : f(z)=z’
set xlabel ’’
set ylabel ’’
set zlabel ’’
set view 0,0,1,1.5 set isosamples 30 set nohidden3d set contour base set nosurface
set cntrparam levels 17
set cntrparam levels incremental -2.0, 0.25 i={0.0,1.0}
U=1.0
f(x,y)=U*(x+i*y)
splot [-2.5:2.5][-2.5:2.5] real(f(x,y)) title ’’
set isosamples 10
flow1.gpは以下の内容である。potent1.pとの違いは実部を虚部に変えただ けである。単に2次元のグラフの=f(x+iy)の等高線を描かせているだけで ある。
set nologscale set noparametric set time
set title ’Im(f(z))=const : f(z)=z’
set xlabel ’’
set ylabel ’’
set zlabel ’’
set view 0,0,1,1.5 set isosamples 30 set nohidden3d set contour base set nosurface
set cntrparam levels 17
set cntrparam levels incremental -2.0, 0.25 i={0.0,1.0}
U=1.0
f(x,y)=U*(x+i*y)
splot [-2.5:2.5][-2.5:2.5] imag(f(x,y)) title ’’
set isosamples 10 スクリプトの実行のさせ方
gnuplot >load ”potent1.gp”
とすれば等ポテンシャル線を見ることができる。
gnuplot >load ”flow1.gp”
とすれば流線を見ることができる。
3.2.2 わき出しと吸い込み
mを実数として、f(z) =mlogzで表される流れを考える。
このとき複素速度はw= m
z であるので、原点以外で渦無しの流れを表し ている。次に等ポテンシャル線と流線を調べる。z=reiθを用いると、
f(z) =m(logr+iθ) ゆえに
Φ =mlogr,Ψ =mθ
等ポテンシャル線と流線は それぞれ、原点を中心とした同心円および原点か らでる放射線群である。次に、流線上の流れの向きを調べてみる。ポテンシャ ルがどちらに動いているかを見れば良い。
vr= ∂Φ
∂r = m r
であるので、m > 0であればvr >0となり、原点からわき出している。
m <0のときは吸い込まれている。このときのそれぞれの流れをわき出し、
吸い込みと呼ぶ。
問
わき出しスクリプトであるpotent2.gp,flow2.gpをgnuplotで実行させて実 際に等ポテンシャル線と流線を描いてみよ。
3.2.3 渦糸
kを実数として、f(z) =iklogzで表される流れを考える。
このとき複素速度はw=im
z であるので、原点以外で渦無しの流れを表し ている。等ポテンシャル線と流線を調べる。z=reiθを用いると、
f(z) =ik(logr+iθ)
ゆえに
Φ =−kθ,Ψ =klogr
等ポテンシャル線と流線は それぞれ、原点からでる放射線群および原点を中 心とした同心円である。次に、流線上の流れの向きを調べてみる。ポテンシャ ルがどちらに動いているかを見れば良い。
vθ=∂Φ
∂θ =−k
であるので、k >0であればvθ <0となり、原点に対してθの負の方向、
すなわち時計回りに回っている。k <0のときは反時計回り。このときの流 れを渦糸と呼ぶ。
問
渦糸スクリプトであるpotent3.gp,flow3.gpをgnuplotで実行させて実際に 等ポテンシャル線と流線を描いてみよ。
3.3 重ねあわせから得られる流れ
3.3.1 一様流とわき出し
一様流とわき出しを重ねあわせてみる。次の関数を考えることになる。
f(z) =U z+mlogz z=reiθを用いると、
f =U reiθ+m(logr+iθ) = (U rcosθ+mlogr) +i(U rsinθ+mθ) θ= 0ではΨ = 0となり、またθ=πではΨ =mπとなる。従って、x軸は 流線である。ところが、Ψ =mπを満たす流線はx軸にもあり、これを式で 書くと、
r= m U
π−θ sinθ
となる。この曲線は右側に開いた半無限のU字型曲線となる。また複素数速 度は
w=f0(z) =U+m z
であり、z→0でw→Uとなり一様流であり、原点の近くではわき出しの 振る舞いをする。従って、あたかもこのU字型曲線を成す物体がおかれてい る様に流体が流れる様が観察されるのである。
問
一様流とわき出しスクリプトであるpotent4.gp,flow4.gpをgnuplotで実行 させて実際に等ポテンシャル線と流線を描いてみよ。
3.3.2 わき出しすいこみ対
z =aとz =−aに同一係数mをもつわき出しとすいこみがあるとする。
このとき、関数は次となる。
f(z) =mlog(z−a)−mlog(z+a) =mlogz−a z+a z−a=r1eiθ1, z+a=r2eiθ2
とおくと、
Φ +iΨ =m{logr1
r2
+i(θ1−θ2)} 従って
Φ =mlogr1 r2
,Ψ =m(θ1−θ2)
Θ = θ1 −θ2 とおくと、Θは2点 −a, a から zを見込む角である。Φ =
constant,Ψ = constanは2点からの距離の比と、見込む角がそれぞれ一定
である点の軌跡である。これは両者ともに円となる。
問
わき出しすいこみ対スクリプトであるpotent5.gp,flow5.gpをgnuplotで実 行させて実際に等ポテンシャル線と流線を描いてみよ。
3.3.3 渦対
z=aとz=−aに同一係数mをもつ時計回りの渦と反時計回りの渦があ るとする。このとき、関数は次となる。
f(z) =iklog(z−a)−iklog(z+a) =iklogz−a z+a 問
渦対スクリプトであるpotent6.gp,flow6.gpをgnuplotで実行させて実際に 等ポテンシャル線と流線を描いてみよ。
前節と同じように考え、ポテンシャル線と流線が共に円となることを示せ。
次にz =aとz =−aに同一係数mをもつ両方時計回りの渦があるとす る。このとき、関数は次となる。
f(z) =iklog(z−a) +iklog(z+a)
z−a=r1eiθ1, z+a=r2eiθ2 とおくと、
Φ +iΨ =ik{logr1r2+i(θ1+θ2)}