C/C++の宿題のまとめ@Wiki
ニュートン法
最終更新:
匿名ユーザー
-
view
- 332 :デフォルトの名無しさん ◆.bx/RmFBek:2005/11/06(日) 20:22:35
- おねがいします。
[1]数値解析
[2]3sin(x)+ln(x)=0
を ニュートン・ラフトン法によって、xを導け
[3]WindowsXP , lcc ,C言語
[4]11/8までの宿題 - 334 :デフォルトの名無しさん :2005/11/06(日) 21:26:01
- #include <stdio.h>
#include <math.h>
double func(double x);
double funcd(double x);
double neuton(double x);
int main(void)
{
double x = 4.0;
int i;
for(i=0;i<100;i++){
printf("%e\n",x);
x = neuton(x);
if(x == neuton(x))break;
}
printf("[x] = %lf",func(x));
return 0;
}
double func(double x)
{return (3*sin(x)+log(x));}
double funcd(double x)
{return (3*cos(x)+1/x);}
double neuton(double x)
{return (x-func(x)/funcd(x));}
ニュートン法ならこれで、xに近い点にある解が求まる
ラフトンてのはシラネ - 338 :デフォルトの名無しさん :2005/11/06(日) 21:36:35
- #include <stdio.h>
#include <math.h>
#include <string.h>
double func(double x);
double funcd(double x);
double neuton(double x);
int main(int argc,char** argv)
{
double _t = 3.0;
int i;
for(i=0;i<100;i++){
_t = neuton(_t);
if(func(_t)==0.0)break;
}
printf("func(%lf) = 0.0",_t);
return 0;
}
double func(double x)
{return (3*sin(x)+log(x));}
double funcd(double x)
{return (3*cos(x)+1/x);}
double neuton(double x)
{return (x-func(x)/funcd(x));}
ちょっと変更 - 341 :332 ◆.bx/RmFBek:2005/11/06(日) 21:58:32
- >>334
本当にありがとうございます。ただ、よければwhile文で
精度まで分かるように プログラムできませんか?
0.1 ,0.01 ,0.001 ,0.0001 ,0.00001 ,0.000001 の精度で
繰り返し回数 まで出るようにしたいのです。 - 344 :デフォルトの名無しさん :2005/11/06(日) 22:07:51
- >>341
いや、精度の意味がわかんね
ニュートン法自体理解してないんじゃないか?
繰り返し回数はi自体が繰り返し回数だよ - 348 :341 ◆.bx/RmFBek:2005/11/06(日) 22:21:23
- >>344
344の場合は繰り返し回数によってxの精度が変わっていますが
(繰り返し回数を多くすることで答えの精度が上がる)、
今回はあらかじめ精度を決めて 何回繰り返したらその精度に
達するか というプログラムを作成したいのです。
下に書くプログラムは 今回の問題とはちがいますけど
「x=5sin(x)」をみたすxの値を 求めたものです。
#include <stdio.h>
#include <math.h>
float f(float x);
float g(float g);
float main()
{
float a,b,c=4.0,h=0.01;
int k=0;
while(fabs(f(c))>10e-6){
k++;
b=c+h;
a=(f(b)-f(c))/h;
c=c-f(c)/a;
}
printf("%f\n",c);
printf("\n%d",k);
}
float f(float x){
return(x+5*sin(x));
} - 349 :デフォルトの名無しさん :2005/11/06(日) 22:26:38
- double epsilon = 0.1;
ってやっといて
>if(x == neuton(x))break;
これを
if( fabs(x - neuton(x)) >= episilon ) break;
にして
>printf("[x] = %lf",func(x));
これを
printf("[x] = %lf [loops] = %d",func(x) , i);
動くかどうかはしらね。 - 354 :デフォルトの名無しさん :2005/11/06(日) 22:38:43
- 349
if( fabs(x - neuton(x)) <= episilon ) break;
「誤差量がep以下になったら」breakする。
- 355 :348 ◆.bx/RmFBek:2005/11/06(日) 22:45:03
- >>354
なぜか[loops]の値が0になるのですけど・・・ - 357 :デフォルトの名無しさん :2005/11/06(日) 22:46:55
- >>355
条件文間違ってる。これだと最初の一回しか処理しない。
>>354 - 359 :デフォルトの名無しさん :2005/11/06(日) 22:47:16
- #include <stdio.h>
#include <math.h>
#define ACC 1e-3
double func(double x);
double funcd(double x);
double neuton(double x);
int main(int argc,char** argv)
{
printf("%d回", get_acc(12.0,ACC));
}
int get_acc(double _x, double acc){
int i=0;double x=_x;
printf("%lf\n",x);
while(fabs(neuton(x)-x)>acc){
x=neuton(x);i++;
printf("%lf\n",x);
}
printf("func(%lf)=%lf\n",x,func(x));
return i;
}
double func(double x)
{return (3*sin(x)+log(x));}
double funcd(double x)
{return (3*cos(x)+1/x);}
double neuton(double x)
{return (x-func(x)/funcd(x));}
こういうこと?