数学のブログ

ベクトルの微分 曲線の長さ、対数関数、速度ベクトル、置換積分法、部分分数

続 解析入門 (原書第2版) (S.ラング(著)、松坂 和夫(翻訳)、片山 孝次(翻訳)、岩波書店)の第2章(ベクトルの微分)、2(曲線の長さ)の練習問題5-a、b.の解答を求めてみる。

d dt ( t , log t ) = ( 1 , 1 t )
( 1 , 1 t ) dt
= 1 + 1 t 2 dt
= t 2 + 1 t 2 dt
u 2 = 1 + t 2 t 2 = u 2 - 1 2 u d u dt = 2 t t = 1 , 2 u = 2 , 5
u 2 u 2 - 1 u t d u
= u 2 u 2 - 1 · 1 u 2 - 1 d u
= u 2 u 2 - 1 d u
= u 2 - 1 + 1 u 2 - 1 d u
= ( 1 + 1 ( u + 1 ) ( u - 1 ) ) d u
= u + 1 2 ( 1 u - 1 - 1 u + 1 ) d u
= u + 1 2 ( log ( u - 1 ) - log ( u + 1 ) )
= u + 1 2 log u - 1 u + 1

よって、 求める曲線の長さは

[ u + 1 2 log u - 1 u + 1 ] 2 5
= 5 - 2 + 1 2 log 5 - 1 5 + 1 · 2 + 1 2 - 1
= 5 - 2 + 1 2 log 6 - 2 5 4 · 1 3 - 2 2
= 5 - 2 + 1 2 log 3 - 5 2 ( 3 - 2 2 )

ここから

t = 3 , 5 u = 10 , 26
26 - 10 + 1 2 log 26 - 1 26 + 1 · 10 + 1 10 - 1

コード

#!/usr/bin/env python3
from unittest import TestCase, main
from sympy import Matrix, Derivative, log, Integral, sqrt
from sympy.plotting import plot_parametric
from sympy.abc import t, u

print('5.')

X = Matrix([t, log(t)])
X1 = Derivative(X, t, 1).doit()


class Test(TestCase):
    def test_a(self):
        self.assertEqual(
            float(Integral(X1.norm(), (t, 1, 2)).doit()),
            float(
                sqrt(5) - sqrt(2) +
                log((3 - sqrt(5)) / (2 * (3 - 2 * sqrt(2)))) / 2
            )
        )

    def test_b(self):
        self.assertEqual(
            float(Integral(X1.norm(), (t, (3, 5))).doit()),
            float(
                sqrt(26) - sqrt(10) +
                log((sqrt(26) - 1) / (sqrt(26) + 1) *
                    (sqrt(10) + 1) / (sqrt(10) - 1)) / 2
            )
        )


p = plot_parametric(
    (*X, (t, 0.1, 1)),
    (*X, (t, 1, 2)),
    (*X, (t, 2, 3)),
    (*X, (t, 3, 5)),
    (*X, (t, 5, 6)),
    show=False,
)
colors = ['red', 'green', 'blue', 'brown', 'orange',
          'purple', 'pink', 'gray', 'skyblue', 'yellow']
for o, color in zip(p, colors):
    o.line_color = color
    print(o, color)
p.save('sample5.png')
p.show()


if __name__ == "__main__":
    main()

入出力結果

% ./sample5.py -v
5.
parametric cartesian line: (t, log(t)) for t over (0.1, 1.0) red
parametric cartesian line: (t, log(t)) for t over (1.0, 2.0) green
parametric cartesian line: (t, log(t)) for t over (2.0, 3.0) blue
parametric cartesian line: (t, log(t)) for t over (3.0, 5.0) brown
parametric cartesian line: (t, log(t)) for t over (5.0, 6.0) orange
test_a (__main__.Test) ... ok
test_b (__main__.Test) ... ok

----------------------------------------------------------------------
Ran 2 tests in 3.822s

OK
%