ページ 1 / 1
よろしくお願いします
Posted: 2017年7月12日(水) 09:11
by 初者ああ
1)sinX-cosX=0をRegular-Falsi法でときなさい
またx1=0 x2=1 ε=10^-6とする 途中経過がわかるように出力しなさい
2)x^2-sinX=0をNweton法でときなさい X0=1 ε=10^-6とする 途中経過がわかるように出力しなさい
よろしくお願いします。
Re: よろしくお願いします
Posted: 2017年7月12日(水) 09:47
by かずま
フォーラムルールに従って質問すると、すぐに回答が得られます。
そうでないと、回答が得られることはほとんどないと思います。
Re: よろしくお願いします
Posted: 2017年7月12日(水) 11:22
by purin52002
regularなんとか法というのを初めて聞いたので作ってみました^^
コード:
(1)regularなんとか法
1:x=0.768540 y=-0.023840
2:x=0.785518 y=0.000169
3:x=0.785398 y=-0.000000
(2)ついでにNewton法(ですよね?きっと?)
1:x=0.891396 y=0.016637
2:x=0.876985 y=0.000288
3:x=0.876726 y=0.000000
手元の電卓で計算したところおおよそ正しい出力だと思います^p^
Re: よろしくお願いします
Posted: 2017年7月13日(木) 00:26
by Math
2) Nweton法は過去ログで何度か答えてます。
Windows10、VS2017Community、C言語
コード:
#include <stdlib.h>
#include <math.h>
#include <stdio.h>
/* --- f(x) 関数定義 --- */
double f(double x)
{
/* x^2-sinx=0 */
return x*x - sin(x);
}
double Df(double x)
{
/* 微分 2x-cosx=0 */
return 2*x - cos(x);
}
/* ---ニュートン法--- */
/* ---f:関数, x:初期値--- */
double newton(double(*fx)(double), double x)
{
double eps = 0.000001;
double xx;
do {
xx = x;
x = x - f(x) / Df(x);
printf("x = %f\n", x);
} while (fabs(x - xx) > eps);
return x;
}
int main()
{
double x;
x = 1;
printf("初期値 x=%f\n", x);
printf("ANS = %f\n", newton(f, x));
return 0;
}
コード:
1>------ ビルド開始: プロジェクト: ConsoleApplication1, 構成: Debug Win32 ------
1>c1.c
1>ConsoleApplication1.vcxproj -> D:\z17a\07\13\ConsoleApplication1\Debug\ConsoleApplication1.exe
1>ConsoleApplication1.vcxproj -> D:\z17a\07\13\ConsoleApplication1\Debug\ConsoleApplication1.pdb (Partial PDB)
========== ビルド: 1 正常終了、0 失敗、0 更新不要、0 スキップ ==========
コード:
初期値 x=1.000000
x = 0.89140
x = 0.87698
x = 0.87673
x = 0.87673
ANS = 0.876726
続行するには何かキーを押してください . . .
Re: よろしくお願いします
Posted: 2017年7月13日(木) 00:54
by Math
あ、”数値微分”をするつもりだったけどやめたのでこれでいいのか。
コード:
#include <stdlib.h>
#include <math.h>
#include <stdio.h>
/* --- f(x) 関数定義 --- */
double f(double x)
{
/* x^2-sinx=0 */
return x*x - sin(x);
}
double Df(double x)
{
/* 微分 2x-cosx=0 */
return 2*x - cos(x);
}
/* ---ニュートン法--- */
double newton(double x)
{
double eps = 0.000001;
double xx;
do {
xx = x;
x = x - f(x) / Df(x);
printf("x = %f\n", x);
} while (fabs(x - xx) > eps);
return x;
}
int main()
{
double x;
x = 1;
printf("初期値 x=%f\n", x);
printf("ANS = %f\n", newton(x));
return 0;
}
Re: よろしくお願いします
Posted: 2017年7月13日(木) 09:40
by usao
オフトピック
・Df(x)の値もチェックした方がよいのではないだろうか?
・初期値がいきなり解! ということも有り得ることを考慮すべきではないだろうか?
とか思ったり.