#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
これは どう見てもシグモイド関数を書き間違えただけでしょうね。(^^;
普通に f(x)=y - 0.1=0 と置いて x軸との接点を求めます。
この場合 微分係数は (1 - fx(x)) * fx(x); と置き換えてはいけません。
return ( exp(-x) / ((1 + exp(-x)) * (1 + exp(-x))) ); と計算します。
[code]
#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))) );
}
[/code]
[url]http://www2.koyoen.birdview.co.jp/~abcxyz/19-01-26-a-.PNG[/url]