#include<iostream>
#include<cmath>
using namespace std;
int main(){
double x1, x2, c;
cout <<"x1:";
cin >> x1;
cout <<"x2:";
cin >> x2;
while(fabs(x2-x1) > 0.00001){
c=(x1+x2)/2;
if(cos(x1/2.0)*cos(c/2)>=0)
x1 = c;
else x2 = c;
}
cout << "x=" << x1 <<endl;
return 0;
}
cos(x/2)=0の解となるxを挟んでいないx1,x2を与えると、結果は保証できないですが、それは別にいいんですか?それはダメだとするとどこを訂正すればいいんですか
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
#4 です。
問題を読み間違えていたようですみません。
問題は、f(x/2)=cos(x/2)=0.0 となる xの値を求められているのですね。
f(x)=cos(x)=0.0 となる点を求めることを考えてコメントしていました。
(指定した変数に直接対応する関数の値を考えるのが普通だと考えていましたので)
申し訳ありませんでした。
cos(x/2)=0 を挟まない x1,x2が与えられた場合の処理についてですが、
while(...){...} の前に入力チェック、変数レンジ変更のロジックを追加します。
まず後の処理を分かりやすくするため、x1<x2となるように必要であれば入力を入れ替えます。
f(x1),f(x2)の符号が異なる場合は現在のwhile文へ進みます。
そうでない場合、dx=x2-x1; を先ず計算します。
その後、関数値の絶対値が小さい方へ、x1或いはx2を適当なステップ幅で
進めて行き、f(x1),f(x2)が異なった符号値になるまで繰返します。
(例えば 0<f(x1)<f(x2) の時、c=x1-dx; x1=c; として繰返す)
その途中で一定回数繰返しても異なった値にならない場合、エラーとする必要があると思われます。
(関数値の変化割合:(f(c)-f(x2))/f(x2):が小さすぎる場合(例えば1/32以下等)は、ステップ幅dxを大きくする等の考慮も最適化迄考えると必要になりますが、初めはそこまでは不要でしょう)
以上等を考慮して検討を進めてください。
No.4
- 回答日時:
二分法のC++プログラム
>簡単なプログラムが自分の思った通りには実行されない場合、
>まずデバッガでステップ実行し、関係する変数値、関数値、どのパスを通っているのかを確認する、
>或いはプリント文を追加し各変数値、関数値、通っているパス等を確認する
>以上をやることはプログラマとしての常識のはずです。
>また関数としては何を考えているのですか、確認してください。
>これまでの他の人のヒントも考慮すれば解決出来るはずです。
>分かってしまえば簡単な事ですから、後は人に頼らず自分で解いてください。
>そうしないといつまでも力が付かないと思います。
以上の通り指摘していたはずですか、各変数値、関数値、実行パスの確認はされましたか?
次のようにprint文を2行追加すればすぐに分かるはずです。
関数値は0に近い値ですか、次第に0に近づいていますか?
if(...){
print(...);
...
}
else {
print(...);
...
}
本当は机上デバッグをすればすぐに分かるはずです。
関数としては何を考えているのですかとのヒントで誤りに気が付かれることを期待していたのですが。
プログラムの中に不要な文字が6文字含まれています。
No.3
- 回答日時:
「解は保証できない」ではなく、「最初に入
れた x1, x2 の値のいずれかに収束」します。
※冷静に考えれば、どちらに収束するかもわか
ります。
あと、プログラムの中に、意味の上では間違っ
ているところが1カ所あります。
正しい解が求められるときには、たまたま、
x1 == x2 == c に収束するので、表示される
結果はあっていますが。
(その意味では、まあ、間違っているとも言
えず、「気持ち悪い」程度かもしれません)
最初に入力された x1, x2 が解を挟むかどうか
は、一般的には、求める方程式 f(x) = 0 に対
して、f(x1) と f(x2) の符号が異なるという
ことですが、このプログラムは、f(x) が単調
増加することを前提としているので、f(x1) > 0
かつ f(x2) < 0 が「解を挟む必要条件」です。
(ただし、x1 > x2)
さらにいえば、これは、「ひとつ以上の解を
挟む」ための条件に過ぎないので、x1, x2 の
範囲が広くて、ふたつ以上の解を挟んでしま
うと(その間に単調減少している部分が存在
するので)失敗することもあります。
これを考えると。
・f(x1) > 0 かつ f(x2) < 0 (x1 > x2)
・f(x1) < 0 かつ f(x2) > 0 (x1 < x2)
・f(x1) = f(x2) = 0 (x1 = x2)
・x1 - x2 の絶対値が f(x) の 1/2 以下
が必要十分条件かなと思います。
最初の3つをまとめると
・f(x1)(x1 - x2) > 0 かつ f(x2)(x1 - x2) < 0
・x1 - x2 の絶対値が f(x) の 1/2 以下
になるのかな?(未検証)
No.2
- 回答日時:
「結果が保証できないけどそれでいいのかどうか」あるいは「それでダメなときにどう訂正すればよいか」はあなたがこのプログラムで解こうとしている問題に依存します.
「よくない」と断言してしまうのはちょっと勇み足っぽい気がします>#1.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C++初心者です stirng 2 2022/09/20 20:43
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- 数学 線形代数の対称行列についての問題がわからないです。 2 2023/01/08 14:59
- C言語・C++・C# ある線が円の範囲に入っているかの計算 1 2022/12/07 16:14
- その他(プログラミング・Web制作) Pythonにおける物理のシミュレーションでの単位変換について 2 2023/06/02 17:11
- Visual Basic(VBA) VBAプログラミング 2 2022/11/27 12:07
- Visual Basic(VBA) VBAプログラミング 2 2022/11/27 12:13
- 数学 数学直線の方程式とベクトル方程式について 直線の方程式で 点(x1,y1)を通り、直線ax+by+c 1 2022/08/12 12:13
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
複数条件のオートフィルタ(VBA)
-
検索結果の指定列をリストボッ...
-
VB.NET)コンボボックスの連動に...
-
エクセルVBAでテキストボッ...
-
C言語のサフィックスについて
-
条件に該当したテキストボック...
-
VB.NETでのイベントの途中終了
-
VBAのユーザーフォームで、テキ...
-
VBA public変数はどのようなこ...
-
画像をランダムに表示させたい...
-
Vba テキストボックスの文字列...
-
VBAで入力数値について
-
VBSのプログラム
-
subsequentとnextの違いってな...
-
画像処理
-
テキストボックスに大文字を
-
【HTML、VBScript】HTAアプリケ...
-
レコードセットにnullの場合
-
他のフォームから別のフォーム...
-
PHP GDでテキストを含む最小の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ドラゴン曲線を再帰で書く
-
VB.NET)コンボボックスの連動に...
-
エクセル・VBAでテキストボック...
-
二点の座標から距離や角度を求...
-
複数条件のオートフィルタ(VBA)
-
テキストファイルの読み込みと...
-
エクセル ユーザーフォーム ...
-
エクセルのVBAでの7×7の魔方陣...
-
C#を勉強していて、指定したフ...
-
C言語で非線形方程式を解くプロ...
-
Linuxのプログラミング
-
Lispにおける最大値関数
-
4変数の非線形方程式のときかた
-
こうもりの撃退法
-
二分法のC++プログラム
-
VC++ (byte)(col & 0xFF) の意味
-
2次元配列を返す関数について
-
VBA for next
-
小数点以下五桁一致の判定
-
lispに関する質問
おすすめ情報