No.6ベストアンサー
- 回答日時:
プログラム書きました。
これで、どうでしょう?
/* 3次方程式の求解 */
#include<stdio.h>
#include<math.h>
#include<float.h>
#define PI 3.14159265358979323846
#define REAL 0 /* 実根 */
#define IMAGE 1 /* 虚数根 */
int main(void){
double a, b, c, d; /* 3次方程式の係数 */
double p, q;
double D;
double x1, x2, x3; /* 根の実部 */
double y1, y2, y3;
double Im; /* 根の虚部 */
double u, v;
double d_u, d_v;
double phi;
int kind; /* 根の種類: REAL, IMAGE */
// ここから
printf("3次方程式(ax^3+bx^2+cx+d=0)の各係数:\n");
printf("a>>>");
scanf("%lf", &a);
printf("b>>>");
scanf("%lf", &b);
printf("c>>>");
scanf("%lf", &c);
printf("d>>>");
scanf("%lf", &d);
// ここまで消して、a, b, c, d値を代入する式を書いてください。
printf("3次方程式(%gx^3%+gx^2%+gx%+g=0)の解は\n", a, b, c, d );
if( a == 0.0 ){
printf("a(%g)がゼロなので,データエラーとみなし,\n", a );
printf("解を求めずに終了します.\n");
return 1; /* 終了コードを1にして,プログラムを終了 */
}
p = ( 3*a*c - b*b ) / ( 9*a*a );
q = ( 2*b*b*b - 9*a*b*c + 27*a*a*d ) / ( 54*a*a*a );
D = q*q + p*p*p; /* Dには誤差が含まれてしまうことに注意 */
if( fabs(D) <= DBL_EPSILON ){ /* Dを数値的にゼロかどうかチェックする */
/* 3つの重根(2重根・3重根)を含む実根 */
y1 = 2*pow(-q, 1.0/3.0);
y2 = y3 = -y1/2;
kind = REAL;
}else if( D < 0 ){ /* 3つの異なる実根 */
phi = acos( -q / pow( -p*p*p, 1.0/3.0 ) );
y1 = 2*sqrt(-p)*cos(phi/3);
y2 = -2*sqrt(-p)*cos(phi/3+PI/3);
y3 = -2*sqrt(-p)*cos(phi/3-PI/3);
kind = REAL;
}else{ /* 1つの実根,2つの共役複素数の解 */
d_u = -q+sqrt(D);
d_v = -q-sqrt(D);
if( d_u >= 0 ) u = pow( d_u, 1.0/3.0 );
else u = -pow( -d_u, 1.0/3.0 );
if( d_v >= 0 ) v = pow( d_v, 1.0/3.0 );
else v = -pow( -d_v, 1.0/3.0 );
y1 = u+v;
y2 = y3 = -y1/2;
Im = sqrt(3)/2*(u-v);
kind = IMAGE;
}
x1 = y1 - b/(3*a);
x2 = y2 - b/(3*a);
x3 = y3 - b/(3*a);
if( kind == REAL ){
printf("x1=%g, x2=%g, x3=%g\n", x1, x2, x3 );
}else{
printf("x1=%g, x2=(%g + %g i), x3=(%g - %g i)\n",
x1, x2, Im, x3, Im );
}
return 0;
}
この回答への補足
プログラムまで作っていただいてどうもすみません!
プログラムが↓の部分辺りからよくわからないのですが
p = ( 3*a*c - b*b ) / ( 9*a*a );
q = ( 2*b*b*b - 9*a*b*c + 27*a*a*d ) / ( 54*a*a*a );
あと、初期値も表示したいのですが(^_^;)
まだ、始めたばかりの初心者なので理解悪くてすみません!
No.7
- 回答日時:
>プログラムが↓の部分辺りからよくわからないのですが
>p = ( 3*a*c - b*b ) / ( 9*a*a );
>q = ( 2*b*b*b - 9*a*b*c + 27*a*a*d ) / ( 54*a*a*a );
ここは、()の中の3*a*cとb*bを先に計算してから引いてます。下も同じような感じです。
これは、演算子が優先順位が高い方から計算されるからです。
演算子の優先順位関して
http://www9.plala.or.jp/sgwr-t/c/sec14.html#s14-5
>あと、初期値も表示したいのですが(^_^;)
プログラム内に記述済み。
これです。「printf("3次方程式(%gx^3%+gx^2%+gx%+g=0)の解は\n", a, b, c, d );」
No.4
- 回答日時:
ニュートン法を使わずに解の公式から解析的に求めたほうが早いのでは?
3次方程式に限定するとどうなるかかんがえてませんが、
ニュートン法は収束性を保障しないので、
任意の式に対して、かならず解を得られるように
初期値を自動で決めることはできないような気がします
No.3
- 回答日時:
この回答への補足
ax^3+bx^2+cx+d=0の場合についても解が求められ、初期値は入力しなくていいようにしたいのですが^_^;
無理ですかね・・・?
何度もすみません<(_ _)>
No.2
- 回答日時:
わざわざありがとうございます<m(__)m>
現在、
1.f(x) = ax^3 + bx^2 + cx + dのa.b.c.dの値を入力する
2.判別式Dによって極値の数を求める
3.極値の数により場合分けをして初期値の位置を決める(初期値もプログラムが決定)
4.Newton法により解を求める
という考えでいます。
参考に載っていた数値計算プログラムの例とは少し違うように思うのですが、説明が難しくてなかなか理解できません(>_<)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 数学 数学微分方程式の問題です。次に書く問題を教えて欲しいです。上端を固定された長さlの棒の先に質量mの質 2 2022/04/29 21:27
- 数学 数学微分方程式の問題です。次に書く問題を教えて欲しいです。質量mの物体が自然長l、ばね定数kのバネで 1 2022/04/29 21:23
- 数学 写真(URL)の問題の(1)についてですが、 円c1は 2点を通ると書いてあることから、 2点の座標 5 2023/02/14 19:44
- 数学 【 数I 2次方程式 重解 】 問題 2次方程式x²-mx+9=0が重解をもつよう に、定数mの値を 1 2022/07/17 19:43
- 数学 高2 数2 3 2022/06/20 21:39
- 数学 一次不定方程式 8086x − 32435y = 13 の一般解を求めよ. 一次不定方程式 205x 3 2022/05/18 08:27
- 数学 数学の問題で法線ベクトルについて 5 2022/11/13 12:45
- 数学 3次方程式の解で実部が正のものが存在する条件の調べ方 0 2023/03/23 15:07
- 数学 高校数学I 2次関数 2つの2次方程式の共通の実数解の問題についての質問です。以下の写真を見てもらえ 4 2022/05/13 11:47
- その他(ビジネス・キャリア) グーグルの障害者訓練プログラム募集あるがどうだろ?6時間勤務で月収22万!! 1 2023/02/17 20:36
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
Cプログラミングの問題です。ニュートン法を利用して3次方程式の解を求めるプログラミング作成。
C言語・C++・C#
-
三次方程式
数学
-
2次方程式の解を求めるプログラミングの課題なのですが、
C言語・C++・C#
-
-
4
Cで3乗根を求める方法
C言語・C++・C#
-
5
三次方程式の解法について
数学
-
6
ニュートン法を使って解を求めるC言語プログラム
C言語・C++・C#
-
7
C言語の複素数についてです。
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
c言語で、繰り返し文の中で、0....
-
Cで3乗根を求める方法
-
float型とdouble型の変数の違い...
-
C言語を実行すると-infが出てき...
-
doubleは常に%lfとするべきなのか
-
関数におけるif文とreturn文に...
-
割り算ができない
-
doubleの変数にintとintの割り...
-
待ち行列シュミレーションのプ...
-
C言語 関数プロトタイプ宣言の...
-
数値を指数部と仮数部に分離したい
-
c言語でDFTのプログラムを作成...
-
至急です! マクロ定義で #defi...
-
(C言語)ニュートン法のプログ...
-
C 開放してるのにエラー(doubl...
-
C言語の複素数についてです。
-
sin,cos,tanを求めるプログラム...
-
floating point not loadedとは?
-
方程式を2分法を用いて解くプロ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
float型とdouble型の変数の違い...
-
doubleの変数にintとintの割り...
-
C言語を実行すると-infが出てき...
-
C 開放してるのにエラー(doubl...
-
至急です! マクロ定義で #defi...
-
c言語で、繰り返し文の中で、0....
-
関数におけるif文とreturn文に...
-
C言語 関数プロトタイプ宣言の...
-
C言語初心者 構造体 課題について
-
C言語の型による処理速度の違い
-
Cで3乗根を求める方法
-
C言語で-23乗を取り扱うには
-
2分法で方程式の複数の解を自...
-
doubleは常に%lfとするべきなのか
-
c言語のコンパイルエラー canno...
-
C言語で直角三角形の斜辺を求め...
-
C言語のプログラムで#include<m...
-
int とdoubleの比較
-
C++で外積
おすすめ情報