- 締切済み
ax-by=c
ax+by=c(x≧0,y≧0)を満たすxの最小値とyの最小値を求める方法ってありますか? しかも、C言語を使って計算したいので、出来る限り効率の良い計算方法が知りたいです。が、とりあえずC言語のことは抜きにして、どんな方法でも良いので数学に自身のある方ぜひご教授願います!! (__)
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- stomachman
- ベストアンサー率57% (1014/1775)
(条件1)ax+by=c (条件2)x≧0かつy≧0 において、(条件1)と(条件2)を共に満たすような<x,y>の集合のうちで ・xが最小であるような<x,y>のxの値 minx ・yが最小であるような<x,y>のyの値 miny を求めたい、という問題と読みました。 言い換えれば、x,y平面にax+by=cのグラフを描いて、その第一象限の部分(つまり条件2を満たす部分)だけを見たとき、 ・xが最小であるような点においてそのときのxは幾らか。 ・yが最小であるような点においてそのときのyは幾らか。 (無論、「xが最小であるような点」と「yが最小であるような点」とは必ずしも一致しません。)という問題です。 ============================ [1] a=0, b=0の場合 (条件1)は 0=c と書き直せます。 [1-1] c=0の場合 x,yとして任意の実数を持ってくると(条件1)は満たされます。 だから(条件2)だけ考慮すればよく、minx = 0, miny = 0 です。 [1-2] c≠0の場合 x,yとしてどんな実数を持ってきても(条件1)は満たせません。従って minx, minyは存在しません。 [2] a≠0, b=0の場合 (条件1)は ax=c と書き直せます。だから x=c/a が(条件1)を満たす唯一のxです。 そして、yは何であっても良い。 [2-1] c=0、またはaとcが同符号の場合(ac≧0と言っても同じ) minx = c/a, miny=0です。 [2-2] c≠0かつ、aとcが異符号の場合(ac<0と言っても同じ) minx,minyは存在しません。 [3] a=0, b≠0の場合 [3-1] c=0、またはbとcが同符号の場合(bc≧0と言っても同じ) minx = 0, miny=c/bです。 [3-2] c≠0かつ、bとcが異符号の場合(bc<0と言っても同じ) minx,minyは存在しません。 [4] a≠0, b≠0の場合 [4-1] c=0の場合 直線ax+by=cは必ず<0,0>を通るから、 minx=0, miny=0 [4-2] c≠0の場合 直線ax+by=cとx軸との交点は<c/a,0>、 直線ax+by=cとy軸との交点は<0,c/b>です。 [4-2-1] aとbが同符号の場合(ab>0と言っても同じ) c/aとc/bは同符号です。 [4-2-1-1] aとcが同符号の場合(ac>0と言っても同じ) <minx,c/b>= <0,c/b>、<c/a,miny> = <c/a,0> です。つまり、 minx=0, miny=0 [4-2-1-2] aとcが異符号の場合(ac<0と言っても同じ) 直線ax+by=cは第一象限を通らない。だから、 minx,minyは存在しません。 [4-2-2] aとbが異符号の場合(ab<0と言っても同じ) <c/a,0>か<0,c/b>、このどちらかが<minx,miny>と等しい。 そしてc/aとc/bはどちらかが正、どちらかが負です。従って、 [4-2-2-1] aとcが同符号なら(ac>0と言っても同じ) c/a > 0 だから minx = c/a, miny = 0 [4-2-2-2] aとcが異符号なら(ac<0と言っても同じ) minx = 0, miny = c/b ============================ さて、これを整理しなおしてみましょう。記号で表して (××) とは「minx,minyは存在しない」のこと (00) とは「minx=0, miny=0」のこと (0▼) とは「minx=0, miny=c/b」のこと (▲0) とは「minx=c/a, miny=0」のこと としてみると、 c>0 b>0: a>0…(00)、a=0…(0▼)、a<0…(0▼) b=0: a>0…(▲0)、a=0…(××)、a<0…(××) b<0: a>0…(▲0)、a=0…(××)、a<0…(××) c=0…(00) b>0: a>0…(00)、a=0…(00)、a<0…(00) b=0: a>0…(00)、a=0…(00)、a<0…(00) b<0: a>0…(00)、a=0…(00)、a<0…(00) c<0 b>0: a>0…(××)、a=0…(××)、a<0…(▲0) b=0: a>0…(××)、a=0…(××)、a<0…(▲0) b<0: a>0…(0▼)、a=0…(0▼)、a<0…(00) となります。 「効率が良い」というのを処理速度のことだとするなら、下手な条件分岐は却って処理速度を落とします。 これをこのまま3次元配列にしておくのがひとつの方法でしょう。つまりたとえば、 a,b,cについて、負のときに0、0のときは1、正のときは2となる番号を付け、 また、(××) を0, (00)を1, (0▼) を2, (▲0)を3で表すことにする。そういう配列dをstaticとして作っておく。ですから、 d[0][1][2] は c<0, b=0, a>0 の場合を表すので、その値は3((▲0)を表す)です。 で、a,b,cが与えられたとき、それぞれの符号を符号関数で取り出して、 負のときは0 0のときは1 正のときは2 となるインデックスia, ib, icを作ります。この3つのインデックスを使って配列dを引く(つまりd[ic][ib][ia]を参照する)と、どんな処理をすべきかの番号(0~3)が取り出せますから、それに従ってswitchすれば良い。
- shadoworks
- ベストアンサー率12% (6/50)
まず、以下を具体的・明確にしてください。 1)計算処理の目的 2)与えられるデータの予想される特徴 3)求めるデータの想定可能な特徴 4)使用するC言語コンパイラの機能 以上のどれが違っても最良の計算法は違います。 繰り返し処理する部分を軽くすると速くなります。 (機械内部の情報格納の都合により、ここを単純 化できるクイックソートはそのため高速です)。 細かい事はコンパイラに任せ、精度を保つため 桁落ちに注意し、似たデータを使い回しましょう。 (時系列で見ると変化のみ再計算すれば良い等) 桁落ちについて 精度=計算する桁数を落とせば簡単に速くなる でしょうし、処理量を増やさずに精度を高く維持 できれば、それは高速化につながるわけです。 数値処理の過程で、絶対値の大きさが余りにも 違う2数を加減算すると、絶対値が小さい方の数 の有効数字の情報量が無駄に消えてしまいます。 ほとんど同じ数値同士を減算したり、絶対値が 等しく符号が反対の数を加算するなど、きわめて ゼロに近い数値が出ると計算精度が失われます。
- hinebot
- ベストアンサー率37% (1123/2963)
mickel131さんの分類を利用させていただき、最小値についてアドバイスを。 ax+by=cが一次関数すなわち直線であることはいいですね。 (2)x軸に平行なとき yの値はxの値に関係なく一定です。よって、xが最小のときつまりx=0が求めるべき値になるでしょうか。 (3)y軸に平行なとき (2)の場合とxとyが入れ替わるだけです。すなわち、xの値はyの値に関係なく一定です。(後略) (1)傾きが -a/b (a≠0,b≠0のとき) 二つの場合があります。すなわち、 -a/b>0 のときと -a/b<0 のときです。 i)-a/b>0 のとき グラフは右上がりになります。よって、xが増加(減少)すれば、yも増加(現象)します。よって、x=0のときか、y=0のときが、x,yどちらも最小値をとります。x=0のときをとるか、y=0のときをとるかは、y切片 (c/b)の符号によります。 ii)-a/b<0のとき グラフは右下がりになります。よって、 xが増加(減少)すると、yは減少(増加)します。(よって、xが最小値のときyが最大値となり、yが最小値のとき今度はxが最大値になります。)従って、何をもって最小値とするかが必要になります。 ※単にxが最小値の場合と、yが最小値の場合を別々に求めればいいなら当然、x=0,y=0がそれぞれの最小値になります。
- mickel131
- ベストアンサー率36% (36/98)
ここに図が書けないので、うまく表現できないのですが、 不等式を満たすxとyの値を組にした点(x,y)をとることを考えてください。 そうして取った点の集合は、平面上のある範囲になります。 これを、「領域」と言います。 領域を図示して、最小・最大を考えるタイプの問題は、 「線形計画法」と言います。 「言います」と言い切っておいて、何ですが、これは、ちょっと不正確な定義です。昔の高校の数(1)の受検参考書には出ていましたが、この頃のには載ってない気がします。今は数(2)の分野に入っています。 直接の答えにはなっていませんが、さらにちょっとだけ書きます。 ax+by=c ---(*) (1)a ≠ 0、b≠0 のとき (*)すなわち、 y=(-a/b)x+(c/b) を満たす点(x,y)の集合は 傾き(-a/b) の直線です。 (2)a=0 ,b≠0のとき (*)は y=(c/b) となり、x軸に平行な直線です。 (3)b=0 ,a ≠ 0のとき、 (*)は、 X=(c/a) となり、y軸に平行な直線です。
- KaitoTVGAMEKOZOU
- ベストアンサー率22% (13/58)
NO1の方に賛成します。最大最小を求める問題は、方法3つあって、 1.数値代入 2.平方完成 3.微分 です。1は一次関数のとき、超絶的に威力を発揮します。2は、すべての2次関数は「相似」であることを利用する解法です。これも破壊的な威力を発揮します。このとき数値代入をして値を求めるので、やはり数値代入は超絶的に威力を発揮します。3はグラフの傾きを考えることによって、グラフの概形をつかみ、数値代入によって値を求める方法で、神がかり的な威力を発揮します。 どの方法も数値代入をしているので、最大最小を求める基本的な方法(最重要方法)は、数値代入であることをここに明記します。
- may-may-jp
- ベストアンサー率26% (324/1203)
一次関数はどんなときも直線です。 その直線がx≧0かつy≧0の範囲にある場合、描ける直線は3通りです。傾きが正の場合と負の場合、あとは0の場合です。 困ったら基本に立ち返ってみることだと思います。
お礼
To:ご回答くださった皆様 4ヶ月半もの間、お礼の一つもしなかったとこを深くお詫び申し上げます。 そして、大変詳細な回答、心より感謝いたします。 ありがとうございました。 しかしながら・・・未だ問題解決には至っておりません。 ですがこのまま放っておくのも失礼なので、一旦〆させていただきます。 ポイントの方ですが、甲乙つけるのは無理なので、全員20点満点といきたいところですが、ポイントつけられる人数に限りがございますので、ここはあえてポイントをつけません。ご了承下さい。 それでは、またの機会に、よろしくお願い致します。 本当にありがとうございました!!