プロが教えるわが家の防犯対策術!

C言語のプログラミング問題です。
ニュートン法を利用して、3次方程式の解を求めるプログラムを作成しなさい。
とのことです。プログラムが得意ではないので、よろしくお願いします。

C言語のプログラミング問題で、ニュートン法を利用して次の3次方程式の解を求めるプログラミングを作成。というものなのですが、プログラミングが苦手でうまくできません。

y=ax^3+bx^2+cx+d (ただし、a>0とする)
任意の係数a,b,c,dを与え、y=0のときの解(実根のみ)を求めるプログラミングを作成せよ。


という問題です。プログラミングの内容を説明しなくてはいけないので、内容のほうも若干詳しく説明していただけると助かります。
どなたか教えてください、よろしくお願いします。

A 回答 (3件)

3次方程式は複雑なので2次方程式で示します.


なんとか頑張って応用してください

前提として実数解のみとし
虚数解の場合はエラー扱いとします。

方程式は a * x ^2 * b * x + c = 0とします

判別式を実装します
CalcDという名前にします。

double CalcD(double a, double b, double c)
{
return b * b - 4 * a * c;
}

特に難しい部分はないと思います
係数から判別式を計算し、それを関数の値として戻しています

次に、方程式本体を解く部分を作ります
Resolvという名前にします

ここで難しいのはエラー(判別式 < 0)をどう扱うか?です
今回の場合、エラーつまり異常事態として扱うので
C++であれば本来、例外で教えるべきなのですが、
例外を扱うと少々難しくなりますのでやめます。

今回は解の個数を戻すことで判定させることとします
解事体は配列に入れて戻すことにします。

int Resolv(double a, double b, double c, double buffer[])
{
// 解の個数を求めます
// 判別式を関数として実装してあるので、それを使います
  double d = CalcD(a, b, c)
if (d < 0)
return 0; // 実数解はありません

  if (d == 0)
{
buffer[0] = -b / (2 * a);
return 1; // 重解です
}
 else
{
buffer[0] = (-b + sqrt(d)) / (2 * a);
buffer[1] = (-b - sqrt(d)) / (2 * a);
return 2; // 相異なる2つの実数解です
}
}

あとはプログラム全体を制御する部分です
しかし、もう部品はありますのであとは簡単です

int main(int argc, char *argv[])
{
// エラーチェックは省略します
 // 本来はパラメータの妥当性を検証すべきです

 double a = atof(argv[0]);
 double b = atof(argv[1]);
 double c = atof(argv[2]);

// 実際に計算します
 double buffer[2];
int n = Resolv(a, b, c, buffer);

// 結果を表示します
 switch (n)
{
case 0:
printf("実数解はありません。");
break;

case 1:
printf("実数解は %f です.", buffer[0]);
break;

default:
printf("実数解は %f と %fです.", buffer[0], buffer[1]);
}

return 0;
}

如何でしょうか?
プログラムの作成の雰囲気のようなものがつかめたでしょうか?
とにかく、分かり易い単位に関数を作ることが大切です。
関数へのパラメータの渡し方
関数からの情報の戻し方(戻り値を使う方法、アドレス渡し(配列もアドレス渡しです)等のテクニックを伝えたつもりです
これを参考に3次方程式も頑張ってください
    • good
    • 0

ニュートン法がどのようなものか, まずは書いてみてください.


「プログラムが得意でない」ことを強調されているということは, これくらい余裕ですよね?
    • good
    • 0

>どなたか教えてください、よろしくお願いします。



何をお教えすればよいのでしょうか。
文面を拝見すると、答えを出すプログラムの作成を依頼なさっているようにお見受けします。
ということは、質問ではなくて丸投げに相当するように思えますが、
ご本人のお気持ちもそういうことでしょうか。
ところで、学校かどこかの課題ですか?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!