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