|
> 超越関数 (2^x) - tan(x) = 0 の解を求めるプログラムがわかりません。
y = 2^x のグラフと、y = tan(x) のグラムは、簡単に書けますよね。
さて、y = tan(x) は、区間 (-π/2, π/2) で連続です。
f(x) = 2^x - tan(x) とすると、上記の 2つのグラフの交点の x座標が解です。
f(x) は、区間 (-π/2, π/2) で連続であり、かつ単調増加であることは
グラフを見ればすぐわかりますから、この区間での解を求めてみましょう。
Newton法を使うと収束が速いのですが、二分探索でも解を求めることが出来ます。
こうすれば、f(x) を微分する必要がありません。2^10 = 1024、2^20 = 1メガ、
2^30 = 1ギガですから、30回もループを回れば、10進で 9桁の精度は出るでしょう。
#include <stdio.h>
#include <math.h>
#define N 50
#define EPS 1e-9
double f(double x) { return pow(2, x) - tan(x); }
int main(void)
{
int i; double a = -1.57, b = 1.57, x, y;
if (f(a) * f(b) > 0) return 1;
for (i = 0; i < N; i++) {
x = (a + b) / 2;
y = f(x);
if (fabs(y) < EPS) break;
if (f(a) * y > 0) a = x; else b = x;
printf("%3d: %12.9f\n", i, x);
}
return 0;
}
|