ケプラー方程式x-e*sin(x)-c=0の解をステップ数とともに出力するプログラムで、e,cはそれぞれ0.5と1です。
xに値を入力して計算させるのですが、どうしてもできません。
下のプログラムリストでおかしいところはどこでしょうか?
// ニュートン法 x-e*sin(x)-c=0
#include <stdio.h>
#include <math.h>
#define e 0.5
#define c 1.0
#define K 10000
double fun(double x);
double bibun(int i,double x);
float m=1.0,n=1.0;
int i=1;
main(){
float x1,x2;
float z;
printf("初期値x0を入力して下さい\n");
scanf("%f",&x1);
for(i=0;i<=K;i++){
x2 = x1 - fun(x1)/bibun(i,x1);
x1 = x2;
z = fun(x1);
z = fabs(z);
if(fabs(z)<=0.00001){
break;
}
if(i==K){
printf("収束しません\n");
exit(0);
}
}
printf("解 = %f\n",x1);
printf("ステップ数 = %d",i);
return 0;
}
// 関数f(x)
double fun(double x1){
double r;
r = x1 - e * sin(x1) - c;
return r;
}
// 微分
double bibun(int i,double x1){
float p;
if(i%2==1){
p = pow((-1.0),m)*e*sin(x1);
m++;
} else {
p = pow((-1.0),n)*e*cos(x1);
n++;
}
return p;
}
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
>koko_uさんの考えてるアルゴリズムはどのようなものですか?
アルゴリズムはニュートン法なんでしょ。
どうもわかっておられないようなので、ひとまず初期値を 0 とか置いて、 x_0 = 0, x_1 = ◯, x_2 = △, ... と計算して下さい。
その後、計算が面倒なのでコンピュータにやらせるとしたらどうすればいいか考えましょう。
わかりました。
新xについて、新f(x)を微分するということをやっていました。
ニュートン法自体をうまく把握できていなかったようです。
ありがとうございました。
No.2
- 回答日時:
サンプルです。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define e (0.5)
#define c (1.0)
#define K (10000)
#define EPS (0.00001)
double f(double x);
double g(double x);
int main(void)
{
double x1, x2;
int i;
printf("初期値x1を入力して下さい\n");
scanf("%lf", &x1);
for (i = 0; i < K; i++) {
x2 = x1 - f(x1) / g(x1);
if (fabs(x2 - x1) <= EPS)
break;
x1 = x2;
}
if (i < K) {
printf("解 = %f\n", x1);
printf("ステップ数 = %d\n", i);
}
else {
printf("収束しません\n");
exit(1);
}
return 0;
}
double f(double x)
{
return x - e * sin(x) - c;
}
double g(double x)
{
return 1 - e * cos(x);
}
(注)インデントのため、全角空白を使っています。
No.1
- 回答日時:
とりあえず、double bibun(int i, double x1) がまったくわからん
1. 戻り値が double なのに何故か float p;
2. m, n が唐突に出現。
3. (-1)^m を求めようとして pow( -1.0, m ) としてるの?普通に場合分けじゃね?
だいたい、ニュートン法って一階微分がわかれば x_(n+1) = x_n - f(x_n)/f'(x_n) でステップバイステップじゃないの?
もっとややこしいことしようとしてるの?
この回答への補足
x_(n+1) = x_n - f(x_n)/f'(x_n) でステップバイステップというのがよく分かりません。x_(n+1)を新たなx_nと考えて計算していくんですよね?そうするとsinとcosが交互に出てくると思って、こんな感じにしてしまったのですが。
koko_uさんの考えてるアルゴリズムはどのようなものですか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# ある線が円の範囲に入っているかの計算 1 2022/12/07 16:14
- Visual Basic(VBA) VBAプログラミング 2 2022/11/27 12:07
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
- Visual Basic(VBA) VBAプログラミング 2 2022/11/27 12:13
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
C言語を実行すると-infが出てき...
-
c言語で、繰り返し文の中で、0....
-
C言語で直角三角形の斜辺を求め...
-
C言語初心者 構造体 課題について
-
float型とdouble型の変数の違い...
-
(C言語)ニュートン法のプログ...
-
doubleの変数にintとintの割り...
-
C 開放してるのにエラー(doubl...
-
C言語で-23乗を取り扱うには
-
2分法で方程式の複数の解を自...
-
Cで3乗根を求める方法
-
至急です! マクロ定義で #defi...
-
プログラミングについての質問
-
相互相関関数
-
たくさんの数の平均を求める方...
-
doubleは常に%lfとするべきなのか
-
listに構造体を格納
-
c言語の問題
-
C言語のpow関数の不具合
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
doubleの変数にintとintの割り...
-
float型とdouble型の変数の違い...
-
c言語で、繰り返し文の中で、0....
-
C言語を実行すると-infが出てき...
-
C言語 関数プロトタイプ宣言の...
-
C 開放してるのにエラー(doubl...
-
C言語の型による処理速度の違い
-
至急です! マクロ定義で #defi...
-
関数におけるif文とreturn文に...
-
c言語のプログラミングについて...
-
2分法で方程式の複数の解を自...
-
-1.#IND00と出てしまうのですが...
-
doubleは常に%lfとするべきなのか
-
C言語のpow関数の不具合
-
C言語で-23乗を取り扱うには
-
C言語で台形公式を使った二重積...
-
Cで3乗根を求める方法
-
sin(x)の近似について
-
2次方程式の解を求めるプログ...
おすすめ情報