- ベストアンサー
何度もすいませんプログラミングについての質問です。
何度もすいませんプログラミングについての質問です。 はさみこみ法を用いて f(x)=x^3-2x=0の[1,2]にある解を求めるプログラムを作成したいのですが どのようなプログラムを作成すればいいですか? 参考などもあると助かります
- みんなの回答 (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)
- kuma_vi_ma
- ベストアンサー率32% (86/262)
Tacosanに同意です。 これに限らず、「宿題・課題やって」的な質問が多く見られます。 このような質問には、コードをそのまま貼らずに、アルゴリズムや考え方だけで回答した方がいいと思います。 brbryukさん あなただけではないのですが、槍玉に挙げるような真似をしてすみません。
- Tacosan
- ベストアンサー率23% (3656/15482)
あなたが「プログラムを作成したい」と思ったのだから, 自力で何とかすべきです. アドバイスだけならともかく, 「どのようなプログラムを作成すればいいですか」と他人に丸投げするのは「作成したい」という思いに反するのではありませんか? abs を使いまくってるのが気持ち悪い>#1. 素直に「y1 と ymid の符号が逆」のように書いた方がいいと思う.
- himajin100000
- ベストアンサー率54% (1660/3060)
#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; }