• ベストアンサー

何度もすいませんプログラミングについての質問です。

何度もすいませんプログラミングについての質問です。 はさみこみ法を用いて f(x)=x^3-2x=0の[1,2]にある解を求めるプログラムを作成したいのですが どのようなプログラムを作成すればいいですか? 参考などもあると助かります

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

 はさみこみ法ではなく、はさみうち法です。そのやり方を示しますので、他の方が回答しているように free lunchではなく、きちんと学習してくださいヨ。 http://133.2.195.70:8080/mbl/BDY00036/SEC00703/OOP-3-12.pdf ↓は、gccの場合ですが、main()関数をいじる必要はありません。#defineのプロプロセッサと figure()関数を任意の数式に合わせれば対応できるようになっています。なお、途中計算過程がどのようになっているのか見れるようになっていますが、不要な場合は /dev/null にリダイレクトしてください( ./a.out 2>/dev/null )。 /* Gcc compiler on Mac OSX */ #include <stdio.h> #include <math.h> #define GOSA 1e-10 #define BEGIN 1.0 #define END 2.0 double figure(double x) { return x*x*x - 2.0*x; } int main(void) { int count = 0; double x0, x1, x, f0, f1, tx = 0.0; x0 = BEGIN; x1 = END; while (1) { count += 1; f0 = figure(x0); f1 = figure(x1); x = (x0 * f1 - x1 * f0) / (f1 - f0); fprintf(stderr, "%3d: \tx0= %f \tx1= %f\t x= %f \t fx= %f\n", count, x0, x1, x, figure(x)); if (fabs(x - tx) <= GOSA) break; tx = x; if (f0 * figure(x) < 0.0) x0 = x; else x1 = x; } printf("f(%f)= %f count= %d\n", x, figure(x), count); return 0; }

その他の回答 (3)

回答No.3

Tacosanに同意です。 これに限らず、「宿題・課題やって」的な質問が多く見られます。 このような質問には、コードをそのまま貼らずに、アルゴリズムや考え方だけで回答した方がいいと思います。 brbryukさん あなただけではないのですが、槍玉に挙げるような真似をしてすみません。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

あなたが「プログラムを作成したい」と思ったのだから, 自力で何とかすべきです. アドバイスだけならともかく, 「どのようなプログラムを作成すればいいですか」と他人に丸投げするのは「作成したい」という思いに反するのではありませんか? abs を使いまくってるのが気持ち悪い>#1. 素直に「y1 と ymid の符号が逆」のように書いた方がいいと思う.

回答No.1

#include <iostream> #include <cmath> using namespace std; double func(double); double solve(double (*f)(double x),double x1,double x2,double epsilon); double func(double x){ return pow(x,3) - 2 * x; } // 「fは[x1,x2]において解があり、この範囲で連続な単調関数」に対するポインタとする。 //それ以外の関数の場合は不明。 // x1 >= x2を満たすとする。C++の例外の投げ方、及びその補足方法を知らないため。 double solve(double (*f)(double x),double x1,double x2,double epsilon){ if ((x2 - x1) <= epsilon){ return (x2 + x1) / 2; } double mid = (x1 + x2) / 2; double y1 = (*f)(x1); double y2 = (*f)(x2); double ymid = (*f)(mid); if((y1 / abs(y1)) * (ymid / abs(ymid)) == -1){ return solve(f,x1,mid,epsilon); }else if((y2 / abs(y2)) * (ymid / abs(ymid)) == -1){ return solve(f,mid,x2,epsilon); } return 1.0; } int main(){ std::wcout << solve(func,1,2,0.0000001) << std::endl; return 0; }

関連するQ&A

専門家に質問してみよう