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));}

こういうこと?

目安箱バナー