ニュートン法について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
さとしいが

ニュートン法について

#1

投稿記事 by さとしいが » 5年前

いまシグモナイト関数でy=0.1のときのxの値をニュートン法で求めたいですがうまくいきません。

初期値は1です。
アドバイスいただけませんか?

コード:

#include<stdio.h>
#include<math.h>

double fx(double x);
double dfx(double x);

int main(void) {

	double x, y, prex,dis;
	int count;
	count = 0; x = y = 0; 
	
		x = 1; y += 0.1;

		while (1) {
			prex = x;

			x = (y - fx(x)) / dfx(x) + x;

			dis = x - prex;
			if (dis < 0.01 && dis > -0.01) {

				printf("y = %f   x = %f\n", y, x);
				
				break;
			}
		}

	return 0;
}


double fx(double x){

	return 1 / 1 + exp(-x);
}

double dfx(double x){

	return (1 - fx(x)) * fx(x);
}

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: ニュートン法について

#2

投稿記事 by みけCAT » 5年前

「シグモナイト関数」でググってみましたが、
AIの現状と技術の概要 - Qiita
しかヒットせず、定義は見つかりませんでした。
どのような関数なのでしょうか?

もし「シグモイド関数」のことでしたら、fxの定義がおかしいように思えますね。
提示されているコードの言語がわかりませんが、
C言語やC++では+演算子より/演算子の方が先に計算されるので、
これらの言語だと仮定すると、fxは1 / 1を先に計算して1 + exp(-x)と同じ意味になります。
return 1 / (1 + exp(-x)); のようにカッコを追加すれば、標準シグモイド関数を計算できるはずです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Math

Re: ニュートン法について

#3

投稿記事 by Math » 5年前

これは どう見てもシグモイド関数を書き間違えただけでしょうね。(^^;

普通に f(x)=y - 0.1=0 と置いて x軸との接点を求めます。

この場合 微分係数は (1 - fx(x)) * fx(x); と置き換えてはいけません。

return ( exp(-x) / ((1 + exp(-x)) * (1 + exp(-x))) ); と計算します。

コード:

#include <stdio.h>
#include <math.h>

double fx(double x);
double dfx(double x);

int main(void) {

	double x, y, prex, dis;
	int count;
	count = 0; x = y = 0;

	x = 1.0; // y += 0.1;

	while (1) {
		prex = x;
		count++;
		// x = (y - fx(x)) / dfx(x) + x;
		x = x - fx(x) / dfx(x);
		
		dis = prex - x;
		printf("count = %d x = %f fx(x) = %f dis = %f    fx(x) / dfx(x)=%f\n",count, x, fx(x), dis,fx(x) / dfx(x));

		// if (dis < 0.01 && dis > -0.01) {

		if (fabs(dis) < 0.00001){

			// printf("y = %f   x = %f\n", y, x);
			printf("答 x = %f\n", x);

			break;
		}

	}

	y = 1 / (1 + exp(-x)); printf("yの値の検証 = %f\n", y);  // 答の検証

	return 0;
}


double fx(double x) {  // x における関数値

	return ( 1 / (1 + exp(-x)) - 0.1);
}

double dfx(double x) {  // x における微分係数

	return ( exp(-x) / ((1 + exp(-x)) * (1 + exp(-x))) );
}
http://www2.koyoen.birdview.co.jp/~abcx ... -26-a-.PNG

返信

“C言語何でも質問掲示板” へ戻る