質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

2521閲覧

二分法(2変数)

sukiyaki

総合スコア15

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/10/14 09:53

###前提・実現したいこと
xを0から2πまで動かしたとき、cos(x)+cos(y)=0 をyについて解きたいです。
###発生している問題・エラーメッセージ

xを動かしてもyが動きません。

###該当のソースコード

C++

1#include <iostream> 2#include <iomanip> 3#include <cmath> 4#include <complex> 5using namespace std; 6 7double f(double x,double y){ 8 return cos(x)+cos(y); 9} 10 11class bisection{ 12 int i; 13public: 14 bisection(); 15 double m; 16 double x; 17 double operator()(double(*func)(double ,double),double a,double b,double eps=1.e-12,int Nmax=50){ 18 for ( i= 1;i<=Nmax;i++) { 19 m = (a + b) /2.; 20 if (func(x,m) > 0) 21 b = m; 22 else 23 a = m; 24 if (func(x,m) == 0 || fabs(a - b) < eps) { 25 return m; 26 break; 27 } 28 } 29 30 if (i > Nmax) 31 cout << "bisection cannot slove it" << endl; 32 return m; 33 } 34}; 35 36int main(){ 37 bisection ob; 38 int N=100; 39 double dx=6.28/N; 40 for(int i=0;i<N;i++){ 41 double x=i*dx; 42 ob(f,0.,6.28); 43 cout << x << " " <<ob.m<< endl; 44 } 45 return 0; 46} 47

###試したこと
課題に対してアプローチしたことを記載してください

###補足情報(言語/FW/ツール等のバージョンなど)
コードが汚く見にくいかと思いますが、回答宜しくお願いします。
より洗練されたコーディングの仕方があればそちらも教えていただけるとありがたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

より洗練されたコーディングの仕方があればそちらも教えていただけるとありがたいです。

少なくともメンバ変数を晒してない版:

C++

1#include <iostream> 2#include <functional> 3#include <cmath> 4 5class bisection { 6private: 7 double eps_; 8 int nmax_; 9public: 10 bisection(double eps = 1.0e-12, int nmax =50) : eps_(eps), nmax_(nmax) {}; 11 double operator()(std::function<double(double,double)> func, double x, double a,double b) { 12 int i; 13 double m; 14 for ( i = 0; i < nmax_; ++i ) { 15 m = (a + b) / 2.; 16 if ( func(x,m) > 0 ) b = m; else a = m; 17 if (func(x,m) == 0 || fabs(a - b) < eps_) { 18 break; 19 } 20 } 21 22 if ( i == nmax_ ) 23 std::cout << "bisection cannot slove it" << std::endl; 24 return m; 25 } 26}; 27 28int main(){ 29 bisection ob; 30 const int N = 100; 31 const double dx = 6.28/N; 32 auto f = [](double x,double y) -> double { return cos(x) + cos(y); }; 33 34 for ( int i = 0; i < N; ++i) { 35 double x = i * dx; 36 double y = ob(f, x, 0.,6.28); 37 std::cout << x << " " << y << std::endl; 38 } 39}

投稿2016/10/14 15:13

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

C++

1for(int i=0;i<N;i++){ 2 double x=i*dx; 3 ob(f,0.,6.28); 4 cout << x << " " <<ob.m<< endl; 5}

これじゃダメでしょ。ob.x を書き換えないと。
正しくは:

C++

1for(int i=0;i<N;i++){ 2 ob.x=i*dx; 3 ob(f,0.,6.28); 4 cout << ob.x << " " <<ob.m<< endl; 5}

投稿2016/10/14 13:56

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sukiyaki

2016/10/16 02:47

解決しました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問