#include<stdio.h> #include<math.h> double Keisan(double x){ double I; I = tanh(x) + (0.2 * x) + 0.3; return(I); } /*微分の計算*/ double Bibun(double x){ double I; double h; h = 0.0000001; I = (Keisan(x+h) - Keisan(x)) / h; return(I); } int main(void){ double x[10]; double y1.y2,u; int i; x[0] = 1.3; /*xの初期解*/ y1 = 1.3; /*同じくxの初期解*/ x[1] = x[0] - (Keisan(x[0]) / Bibun(x[0])); /*減速を用いないNewton法アルゴリズム*/ while(1){ x[i+1]=x-(Keisan(x)/((Keisan(x)-Keisan(x[i-1]))/(x-x[i-1]))); ++i; if(Keisan(x) < 0.000001 && Keisan(x) > -0.000001) break; } /*減速を用いるアルゴリズム*/ /***************************************** while(Keisan(y1) > 0.001){ y2=y1-u*Keisan(y1)/Bibun(y1); while(fabs(Keisan(y2))>(1-u/4)*fabs(Keisan(y1))){ u=u/2; y2=y1-u*Keisan(y1)/Bibun(y1); } y1=y2; } *****************************************/ printf("x = %.10lf\n",x); printf("A. %.10lf\n",Keisan(x)); //printf("x = %.10lf\n",y1); //printf("A. %.10lf\n",Keisan(y1)); return(0); }
エラーの原因が解りません
エラーの原因が解りません
久々に質問をさせていただきます。学校の課題でニュートン法を用いた非線形方程式の解を求めるプログラムを組み立てたのですが、妙な所でエラーが出ました。まず減速を用いないプログラムを作ってみて、それがうまく動いたので次は減速を用いたアルゴリズムを加えました(下のプログラムでコメントで囲っている部分です)。最初はそこがエラーを吐き出しているのかと思ったのですが、どうやら y1 = 1.3 の部分でエラーが出ているようなのです(y1 = 1.3 をコメントアウトするとエラーが出ませんでした)。別にy1の型も間違っていないし、原因が解りません。どこに原因があるのか解らないのでプログラムは丸上げしています。どうか間違いの御指摘のほどよろしくお願いします。emacsからのコピペが出来ないので直接手打ちしていますので綴りミスなど細かい間違いもあるかもしれませんが、そこは無視して下さい。
Re:エラーの原因が解りません
y1が定義されていないからではないでしょうか?
>>double y1.y2,u;
よく見ると.(カンマ)になっていますよ。
double y1,y2,u;
と変更するとエラーが外れると思います。
できればエラーをそのまま載せていただければ、
もっと的確なアドバイスができると思いますよ^^
あとプレタグを使われるとコードが見やすくなりますよ。
>>double y1.y2,u;
よく見ると.(カンマ)になっていますよ。
double y1,y2,u;
と変更するとエラーが外れると思います。
できればエラーをそのまま載せていただければ、
もっと的確なアドバイスができると思いますよ^^
あとプレタグを使われるとコードが見やすくなりますよ。
Re:エラーの原因が解りません
>x[i+1]=x-(Keisan(x)/((Keisan(x)-Keisan(x[i-1]))/(x-x[i-1])));
>++i;
iの初期値を設定していません。
また、xを配列にしなくてもよいのではないでしょうか。
たまたま、x[10]の範囲で収束すればよいですが、
そうでないと、配列の定義範囲外の領域を延々と破壊し続けます。
>++i;
iの初期値を設定していません。
また、xを配列にしなくてもよいのではないでしょうか。
たまたま、x[10]の範囲で収束すればよいですが、
そうでないと、配列の定義範囲外の領域を延々と破壊し続けます。
Re:エラーの原因が解りません
>s-rushさん、Mistさん
>emacsからのコピペが出来ないので直接手打ちしていますので綴りミスなど細かい間違いもあるかもしれませんが、そこは無視して下さい。
と書かれていますので、無視してあげましょう。
今回の話は、実行時のエラーです。
>emacsからのコピペが出来ないので直接手打ちしていますので綴りミスなど細かい間違いもあるかもしれませんが、そこは無視して下さい。
と書かれていますので、無視してあげましょう。
今回の話は、実行時のエラーです。
Re:エラーの原因が解りません
>>boxさん
>y1 = 1.3 をコメントアウトするとエラーが出ませんでした
ということから文法エラーかと思いました。
実際にその点を修正したのち、コンパイルするとエラーが出ませんでしたので・・・
(iが初期化されていないから、望む結果が得られないかも知れませんが、)
何のエラーが出たのかが分からないことには、なんとも言えませんが^^;
>y1 = 1.3 をコメントアウトするとエラーが出ませんでした
ということから文法エラーかと思いました。
実際にその点を修正したのち、コンパイルするとエラーが出ませんでしたので・・・
(iが初期化されていないから、望む結果が得られないかも知れませんが、)
何のエラーが出たのかが分からないことには、なんとも言えませんが^^;
Re:エラーの原因が解りません
>>y1 = 1.3 をコメントアウトするとエラーが出ませんでした
>ということから文法エラーかと思いました。
もし、質問者さんのもともとのコードが本当に
>double y1.y2,u;
であるとすると、
>>y1 = 1.3 をコメントアウトするとエラーが出ませんでした
このような状況にはなりません。
>ということから文法エラーかと思いました。
もし、質問者さんのもともとのコードが本当に
>double y1.y2,u;
であるとすると、
>>y1 = 1.3 をコメントアウトするとエラーが出ませんでした
このような状況にはなりません。
Re:エラーの原因が解りません
>質問者さん
減速を用いたアルゴリズムでは、u を初期化していない点が問題です。
0を超えて1未満の数値で初期化する必要がありそうです。
iとuを適切に初期化すれば、
減速を用いないアルゴリズム/減速を用いるアルゴリズムともに、
tanh(x) + 0.2 * x + 0.3 = 0 を満たす値が求まります。
減速を用いたアルゴリズムでは、u を初期化していない点が問題です。
0を超えて1未満の数値で初期化する必要がありそうです。
iとuを適切に初期化すれば、
減速を用いないアルゴリズム/減速を用いるアルゴリズムともに、
tanh(x) + 0.2 * x + 0.3 = 0 を満たす値が求まります。
Re:エラーの原因が解りません
沢山の返答ありがとうございます。
細かいミスについては学校にファイルを置いてきてしまったのでちょっと解りません。
あと、皆様の話を聞いて自分の説明不足に気付きました。エラーといってもコンパイルエラーでは無いのです。実行時に何故かセグメントエラーが吐き出されました。肝心のところでの説明不足、本当にすみません。
>減速を用いたアルゴリズムでは、u を初期化していない点が問題です。
>0を超えて1未満の数値で初期化する必要がありそうです。
すみません、u=1、i=1それぞれ設定しています。書き忘れていました。実際のプログラムでは両方とも初期化しています。
>あとプレタグを使われるとコードが見やすくなりますよ。
一応使ったのですが……どうも各行間で一行開いただけみたいです。手打ちは駄目なのかしら?
>また、xを配列にしなくてもよいのではないでしょうか。
>たまたま、x[10]の範囲で収束すればよいですが、
>そうでないと、配列の定義範囲外の領域を延々と破壊し続けます。
そうですね……そこは改良します。ご指摘ありがとうございます。
もしかしてこれはプログラムミスとか、そういう次元ではないエラーのような雰囲気が……PCのせいという可能性もあるのでしょうか?
細かいミスについては学校にファイルを置いてきてしまったのでちょっと解りません。
あと、皆様の話を聞いて自分の説明不足に気付きました。エラーといってもコンパイルエラーでは無いのです。実行時に何故かセグメントエラーが吐き出されました。肝心のところでの説明不足、本当にすみません。
>減速を用いたアルゴリズムでは、u を初期化していない点が問題です。
>0を超えて1未満の数値で初期化する必要がありそうです。
すみません、u=1、i=1それぞれ設定しています。書き忘れていました。実際のプログラムでは両方とも初期化しています。
>あとプレタグを使われるとコードが見やすくなりますよ。
一応使ったのですが……どうも各行間で一行開いただけみたいです。手打ちは駄目なのかしら?
>また、xを配列にしなくてもよいのではないでしょうか。
>たまたま、x[10]の範囲で収束すればよいですが、
>そうでないと、配列の定義範囲外の領域を延々と破壊し続けます。
そうですね……そこは改良します。ご指摘ありがとうございます。
もしかしてこれはプログラムミスとか、そういう次元ではないエラーのような雰囲気が……PCのせいという可能性もあるのでしょうか?
Re:エラーの原因が解りません
セグメントエラーはメモリのアクセス侵害が原因で生じるエラーだったと思います。
私自身もよく分からないのですが・・・
考えられる原因としては
・アクセスできないアドレスにアクセスした
・獲得したアドレスを越えてアクセスした
・初期化していないポインタ変数を使ってアクセスした
でしょうか。
プログラムの途中で、メモリのアクセス侵害が起こると強制的にプログラムが終わります。
なので、そのメモリのアクセス侵害を起こしている部位を特定する必要があります。
私自身もよく分からないのですが・・・
考えられる原因としては
・アクセスできないアドレスにアクセスした
・獲得したアドレスを越えてアクセスした
・初期化していないポインタ変数を使ってアクセスした
でしょうか。
プログラムの途中で、メモリのアクセス侵害が起こると強制的にプログラムが終わります。
なので、そのメモリのアクセス侵害を起こしている部位を特定する必要があります。
Re:エラーの原因が解りません
手打ちでなくて実際のコードそのものを
何らかの方法で見せていただく必要がありそうです。
実際のコードが、質問者さんと回答者との認識の土台となります。
回答者側が(質問者さんとの意図とは無関係に)勝手にコードを修正して
「ほら、こうすれば動きますよ」といっても、その修正結果が
質問者さんの手元にあるコードと食い違ったのでは
何にもなりませんね。
何らかの方法で見せていただく必要がありそうです。
実際のコードが、質問者さんと回答者との認識の土台となります。
回答者側が(質問者さんとの意図とは無関係に)勝手にコードを修正して
「ほら、こうすれば動きますよ」といっても、その修正結果が
質問者さんの手元にあるコードと食い違ったのでは
何にもなりませんね。
Re:エラーの原因が解りません
>回答者側が(質問者さんとの意図とは無関係に)勝手にコードを修正して
>「ほら、こうすれば動きますよ」といっても、その修正結果が
>質問者さんの手元にあるコードと食い違ったのでは
>何にもなりませんね。
全くその通りですね……考えてみます。しかしemacsは不便するなぁ。こんなのは大学のPCだけなのかな?
>「ほら、こうすれば動きますよ」といっても、その修正結果が
>質問者さんの手元にあるコードと食い違ったのでは
>何にもなりませんね。
全くその通りですね……考えてみます。しかしemacsは不便するなぁ。こんなのは大学のPCだけなのかな?
Re:エラーの原因が解りません
なんかよく解りませんが今日やってみたらエラーが出ませんでした。パソコンの台を変えてみたのが良かったのでしょうか?
ともかく、理由は解りませんが解決したようです。質問に答えて下さった方々ありがとうございます。
ちなみに、emacs をコピペするにはcatを使って端末に一度表示するだけで良かったんですね。これからはきちんとそうします。
ともかく、理由は解りませんが解決したようです。質問に答えて下さった方々ありがとうございます。
ちなみに、emacs をコピペするにはcatを使って端末に一度表示するだけで良かったんですね。これからはきちんとそうします。