「プログラムソース」 5−1、------------------------------------------------------------- #include #include #define I(x,y) ((x)*(x)*(x)-3*(x)*(y)*(y)-3*(x)*(x)+3*(y)*(y)+4*(x)-2) #define R(x,y) (3*(x)*(x)*(y)-(y)*(y)*(y)-6*(x)*(y)+4*(y)) #define Ix(x,y) (3*(x)*(x)-3*(y)*(y)-6*(x)+4) #define Iy(x,y) (6*(y)-6*(x)*(y)) #define Rx(x,y) (6*(y)*(x)-6*(y)) #define Ry(x,y) (3*(x)*(x)-3*(y)*(y)-6*(x)+4) #define EPS 1e-8 #define LIMIT 50 int main() { double x,y,dx; int k; printf("xの初期値を入力してください "); scanf("%lf",&x); printf("yの初期値を入力してください "); scanf("%lf",&y); for(k = 1;k <= LIMIT;k++){ dx = x; x = x - (I(x,y) * Ry(x,y) - R(x,y) * Iy(x,y)) / (Ix(x,y) * Ry(x,y) - Iy(x,y) * Rx(x,y)); y = y - (R(x,y) * Ix(x,y) - I(x,y) * Rx(x,y)) / (Ix(x,y) * Ry(x,y) - Iy(x,y) * Rx(x,y)); if(fabs(x - dx) < fabs(dx) * EPS){ printf("z = %f + i * %f\n",x,y); break; } } if(k > LIMIT){ printf("収束しない\n"); } return 0; } ------------------------------------------------------------------------- 「実行結果」 5−1-------------------------------------------------------------------------- C:\Documents and Settings\i865gpen4\My Documents\プログラムソース>newton_tahenns uu xの初期値を入力してください 1 yの初期値を入力してください 1 z = 1.000000 + i * 1.000000 C:\Documents and Settings\i865gpen4\My Documents\プログラムソース>newton_tahenns uu xの初期値を入力してください 1 yの初期値を入力してください 0 z = 1.000000 + i * 0.000000 C:\Documents and Settings\i865gpen4\My Documents\プログラムソース>newton_tahenns uu xの初期値を入力してください 1 yの初期値を入力してください -1 z = 1.000000 + i * -1.000000 C:\Documents and Settings\i865gpen4\My Documents\プログラムソース>newton_tahenns uu xの初期値を入力してください 2 yの初期値を入力してください 3 z = 1.000000 + i * 1.000000 C:\Documents and Settings\i865gpen4\My Documents\プログラムソース>newton_tahenns uu xの初期値を入力してください 4 yの初期値を入力してください -3 z = 1.000000 + i * -1.000000 C:\Documents and Settings\i865gpen4\My Documents\プログラムソース>newton_tahenns uu xの初期値を入力してください 1 yの初期値を入力してください 2 z = 1.000000 + i * 1.454545 C:\Documents and Settings\i865gpen4\My Documents\プログラムソース>newton_tahenns uu xの初期値を入力してください 1 yの初期値を入力してください 3 z = 1.000000 + i * 2.076923 C:\Documents and Settings\i865gpen4\My Documents\プログラムソース>newton_tahenns uu xの初期値を入力してください 1 yの初期値を入力してください 4 z = 1.000000 + i * 2.723404 C:\Documents and Settings\i865gpen4\My Documents\プログラムソース>newton_tahenns uu xの初期値を入力してください 1 yの初期値を入力してください 6 z = 1.000000 + i * 4.037383 -------------------------------------------------------------------------------- 「考察」 複素数の関数を使ってうまくこの問題を解く方法が思いつかなかったので、z=x+iy として、それを与式に代入し、実部と虚部にわけそれらの係数が0になるときのxとyの 解を考えることで、zの解を求める方法をとった。 いいかえると、xとyの連立方程式のニュートン法を考えた。 ひとまず、プログラムはうまく動作しているみたいだ。xとyの初期値を色々入力してみ ることで、xとyの解が全て出力することができた。 ただ、xの初期値を1として、yの初期を色々変化させてみると、少し変な挙動が現われ た。実行結果にもそれを載せておいたが、yの初期値に近いなんらかの値が出力されてい た。これは、xとyの連立方程式をみたときに、x=1の時実数部の方程式はyの数値に 関係なく0になるために生じてるいるのではないかと考えられる。または、ニュートン法 は近似を使っているために、x=1の時になにか不都合がおきているのか。 正確に求めることのできた、 (x、y)=(1,1)(1,0)(1、−1) は、まず間違いなく解であるので、ニュートン法による方程式はうまく動作しているので はないだろうか。