
方程式 cos^2x-0.5=0 (0<x<π) の解をニュートン法で求める
という問題をC言語のプログラムを作り計算したいのですが分かりません。
自分で考えてみたプログラムは以下の通りです。
#include <stdio.h>
#include <math.h>
#define f1(x) cos(x)*cos(x)-0.5
#define f2(x) sin(2*x)
/* ニュートン法による方程式の解 */
main()
{
double x0,x1,a,b,c,d,g,n;
a=1;
x0=0.7;
n=0;
while(a>0.0001){
b=x0;
d=f1(b);
g=f2(b);
x1=x0-d/g;
c=x1;
a=f1(c);
n=n+1;
printf(" n= %f x1=%f x0=%f\n",n,x1,x0);
printf(" a= %f → 解 x= %f \n", a,x1);
x0=x1;
}
}
自分としてはこれが精一杯で、何故間違ってるのか、何をどうすればいいのか、さっぱり分かりません。どういったところが間違ってるのか可能性だけでも示して頂ければ幸いです。
参考として、ニュートン法によるプログラム例として書かれていたものを上げさせて頂きます。
例: e^x-3=0 の解をニュートン法により計算する。
#include <stdio.h>
#include <math.h>
#define f1(x) exp(x)-3
#define f2(x) exp(x)
/* ニュートン法による方程式の解 */
main()
{
double x0,x1,e,a,b,c,d,g,n;
a=1;
x0=3;
n=0;
while(a>0.0001){
b=x0;
d=f1(b);
g=f2(b);
x1=x0-d/g;
c=x1;
a=f1(c);
n=n+1;
printf(" n= %f x1=%f x0=%f\n",n,x1,x0);
printf(" a= %f → 解 x= %f \n", a,x1);
x0=x1;
}
}
A 回答 (6件)
- 最新から表示
- 回答順に表示
No.6
- 回答日時:
>正常には作動しているのですが
>範囲がおかしいのか1回しか計算されない
そうですか?
初期値x0に解の近傍の0.7与えているんで1回しか計算されなくてもしょーがない、とか思うんですけどね。
一般に、ニュートン法は収束までのステップ数は短いんで、当然だ、と思いますよ。
それより、問題は収束判定の
a>0.0001
の方だと思います。これがaが負になった場合、対処してない、って思うんですが。
例えば、計算でf1(c)=-2000何とやら、となった場合、そこで計算が止まってしまいます。これは要求仕様じゃないでしょ?
多分、やりたかったのはaの絶対値>0.0001だと踏んでるんですが、それがコードに反映されていません。問題の性質から言うと、初期値はπの付近(例えば3.0とか)からスタートしても解を返さなきゃならない筈、なんですが、元々のコードを微分の部分だけ手直ししたら、おかしな解が出てくるんじゃないのかな、って思います。
その辺、ちょっと見てみてください。
No.4
- 回答日時:
> (sin^2x)'
> =2(sinx)(sinx)'
> =2sinx*cosx
> =sin(2X)
>
> となると思ったのですが…
> よろしければ微分の何が違ってるかご指摘下さい。お願いします。
微分される関数はcos^2x - 0.5ですよね?
なぜsin^2xの微分をしているのでしょうか?
(cos^2x - 0.5)'
= (cosx)(-sinx)
= -(sinx)(cosx)
= -sin2x
となります。
何度もありがとうございます。
焦って違う問題の計算メモを書いてしまいました。
すみません。
マイナスがなかったのも自分の字が汚かっただけのようです。
ご丁寧にありがとうございました。
No.2
- 回答日時:
Cのマナーの部分と、数学の部分と、2つありますね。
Cの部分:
1:書き出しはmain()じゃなくってint main(void)にした方が良い。
これはツマラない部分ですし、計算結果は同じですが、「Cのマナー」としては、引数を取らないmain関数では引数はvoid、とした方が良い、です。
また、main関数の返り値自体も厳密に言うと、「計算結果とは別にして」OSに対して整数が返されます。従って、
2:正常にプログラムが終了した事を伝える為、返り値を返すように必ず最後にreturn 0;を付ける。
これもマナーです。計算結果を別にOSに「正常終了したよ~~。」と教える為、return 0;も必ず記述するようにしましょう。
数学の部分:
#1さんも仰っている通り、(cos(x))^2-0.5の微分はsin(2*x)になりません。計算ミス、ですね。
プログラムは「言われた通りに計算してる」だけですんで、与えた微分係数が間違ってても感知せずに、「言われた通りに計算している」だけです。
特に、コンパイル時にエラーが出ないで正常実行出来るCによるプログラムの場合、プログラムの記法自体にはさほど問題が見られません。つまり、こう言うケースでは「プログラムを記述した人間が」何かミスをした、って事ですね。
このソースも微分係数をキチンと書き換えれば、そのままキチンとした計算結果を返してくれました。つまり、全体としてのロジックは全然間違ってなく、単に「与えた微分係数が間違ってた」ってだけですね。
回答ありがとうございます。
Cのマナーについてですが、今このように授業で習っているのでその先生に対して違う書き方でプログラムを書いて出すことは出来ないのでどうかそこは見逃して下さい。一応、cametan_42がおっしゃられている書き方が基本だと理解してはいるのですが…。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
ニュートン法を使って解を求めるC言語プログラム
C言語・C++・C#
-
方程式を2分法を用いて解くプログラム
C言語・C++・C#
-
(C言語)ニュートン法のプログラムの為の数値微分
C言語・C++・C#
-
4
C言語の二分法のプログラムについて
C言語・C++・C#
-
5
数値計算??
Java
-
6
C言語 二分法 プログラム
その他(プログラミング・Web制作)
-
7
C言語でニュートン法を使い2次方程式の解を求める
C言語・C++・C#
-
8
Cプログラミングの問題です。ニュートン法を利用して3次方程式の解を求めるプログラミング作成。
C言語・C++・C#
-
9
e^(x^2)の積分に関して
数学
-
10
x=tan(x)この方程式を解く方法を教えてください。
数学
-
11
3次方程式の求解プログラム(ニュートン法)について!
C言語・C++・C#
-
12
2分法で方程式の複数の解を自動的に求めるには?
C言語・C++・C#
-
13
ルンゲクッタ法で数値解析(C言語)
物理学
-
14
導体で同心の外球、内球があり内球が接地されています。
その他(自然科学)
-
15
C言語プログラム(二分法)について質問です。
C言語・C++・C#
-
16
ラグランジュの補間法のCプログラム
C言語・C++・C#
-
17
同心球導体球の接地について
物理学
-
18
e^-2xの積分
数学
-
19
2次方程式の解を求めるプログラミングの課題なのですが、
C言語・C++・C#
-
20
無限に長い円筒の側面上に電荷が一様な面密度
物理学
関連するQ&A
- 1 cos^2(x+(π/3))+cos^2(x+(2π/3))+cos^2(x+π) 。簡単な方法で。
- 2 (1) y=x-cosx(0<x<π) (2) y=-x^4+4x^3-6x^2+4x この2つの凹
- 3 0≦X<2πのとき、方程式cos2X=-5cosX+2の解は何ですか?解説もよろしくお願いします!
- 4 数学についてです。 lim[x→0](sin^2x-(x^2)cos^2x)/(x^2)sin^2x
- 5 f(x1,x2)=12x1x2(1-x2) (0<x1<1,0<x2<1の時)0 (その他の時)における確率変数X1と
- 6 0≦x≦π/2の時 y=6cos^2x+4√3sinxcosx+2sin^2x の最大値・最小値を求
- 7 F(x)=cos(x) (0<x<π)の逆関数について
- 8 質問です。f(x)=x+π ,(-π<x<π)の時の周期2πのフーリエ級数展開せよ。という問題で奇関
- 9 楕円 a,bが0<b<aを満たす定数のとき,方程式 x^2/a^2+y^2/b^2=1 という式が成
- 10 定積分∫[0~π/2]log{a^2(cos x)^2+b^2(sin
おすすめ情報
このQ&Aを見た人がよく見るQ&A
人気Q&Aランキング
-
4
ニュートン法をC言語でプログラム
-
5
二次関数の近似式を求めるため...
-
6
体積の計算(中学生)
-
7
ばらつきの掛け算
-
8
多変数多項式の係数の求め方
-
9
三角形の外接円の中心座標を求...
-
10
写真のような分配ばねの等価ば...
-
11
数学A 2桁以上の自然数Nについ...
-
12
多変数関数の解法について
-
13
連続型確率変数の最大値と最小...
-
14
最大値の期待値が元の数の期待...
-
15
二点の座標から直線の方程式を...
-
16
関数f(x1,x2,x3,x4,x5)が最大値...
-
17
連立二階微分方程式
-
18
数式が解けません
-
19
単調増加関数とは何か?
-
20
3次曲線の長さの求め方
おすすめ情報