多変数関数の最大値
- 7変数の多変数関数をf(a,b,c,d,e,f,g)=19a+18b+17c+16d+15e+13f+11gとする。
- 条件(1)〜(3)をすべて満たす時のfの最大値を求めよ。
- 問題を解くためのフリーソフトも探している。
- ベストアンサー
多変数関数の最大値
7変数の多変数関数をf(a,b,c,d,e,f,g)=19a+18b+17c+16d+15e+13f+11gとする。次の3つ条件をすべて満たす時のfの最大値を求めよ (1)a,b,c,d,e,f,gは0≦a,b,c,d,e,f,g≦98を満たす整数 (2)a+b+c+d+e+f+g=98 (3)3a+4b+5c+7d+8e+10f+12g=544 この問題はどっかの問題集にあったものではなくあるものを求めるために自分で作った問題です。しかしいくらがんばっても自分ではどうすることもできません。この問題はどうすれば解くことができるのでしょうか?この問題を解けるようなフリーソフトを探しましたが見つかりませんでした。もし問題を解けるフリーソフトがあるならそれも教えて欲しいです。
- 数学・算数
- 回答数3
- ありがとう数2
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
まず、関数をfとするなら内部変数にfを使うのはやめるべき。 直後のfの最大値は関数なのか変数なのか分からない。 19a+18b+17c+16d+15e+13f+11g =23(a+b+c+d+e+f+g)-(3a+4b+5c+7d+8e+10f+12g)-a-b-c =23*98-544-(a+b+c) =1710-(a+b+c) この最大値を求めるので、(a+b+c)が最小のときを考える。 つまりなるべくdefgの値を増やすことを考える。 a+b+c=0とすると、 d+e+f+g=98だが7d+8e+10f+12g>=7(d+e+f+g)=98*7=686となり544を超えてしまう。 よって仮にdが98、残りが0のときを考えると、 3a+4b+5c+7d+8e+10f+12g=686 dを減らす代わりにefgを増やしても686から大きくなるだけなので、 仕方が無いのでabcの値を大きくすることを考える。 dを1減らしたとき、aかbかcを1増やすわけだが、aなら4、bなら3、cなら2が686から減っていく。 なるべくdを減らしたくないので、aを増やすのが効率がよい。 (686-544)/4=35.5 つまりa=35でc=1とするか、a=34でb=2とするかすればa+b+cが最小の36になる。 このときd=62。 (a,b,c,d,e,f,g)=(35,0,1,62,0,0,0)(34,2,0,62,0,0,0)で 19a+18b+17c+16d+15e+13f+11gは最大値1674をとる。 コードを書いた方が簡単だったかも知れない。
その他の回答 (2)
大概、多変数関数の条件付き極値の問題は、ラグランジュの未定乗数法を用いますが、各変数が整数であり、かつ(この場合は)乗数も定まらないので、プログラミングを使うのが妥当かもしれませんね。 私は専門外ですが、C 言語の for 文を使えば(原理的には)可能かと思います。但し、その前に、(2)(3) の式を e, f についてそれぞれ解いて、f(a, ... , g) に代入し、5変数函数に直した方が良いでしょう。とはいえ、for 文を単純に繰り返し使えば、99^5 = 9509900499 回の計算をしなくてはならなくなるので、時間がかかるかもしれません。
補足
わざわざご解答ありがとうございます。
- N64
- ベストアンサー率25% (160/622)
線形計画法 というキーワードで探してみたらいかがでしょう。
お礼
線形計画法と打ち込んで検索したところ一応プログラムを見つけることができました。どうもありがとうございました!
関連するQ&A
- 関数で、最大値のあるセルの列を表示したい
エクセルの関数について教えてください。 セルH1に関数を使って、列A、列C、列E、列Gの最大値を出しました。 その下のH2のセルに、関数を使って、列A、列C、列E、列Fの最大値のある列(A,B,C,Dのいずれか)を表記させたいのですが(下記のように)、可能でしょうか? A B C D E F G H 1 10 ※ 28 ※ 66 ※ 26 99 2 56 ※ 29 ※ 89 ※ 28 A 3 99 ※ 12 ※ 66 ※ 10 (列Hが上記のようになるようにしたいのです。)
- ベストアンサー
- オフィス系ソフト
- EXCELの関数式(INT,MOD)で教えて下さい
下図のようなEXCELの表があります。 金種計算で、1行目は1万円、5千円、千円・・・10円と入っており、 A2は計算したい金額(97810)を入れています。 B2セルの式=INT($A2/B1)、C2セルの式=INT(MOD($A2,B1)/C1)で、C2セルの式はD2~H2に複写しています。 EXCELで得た計算結果(2行目)は正しいと思うのですが、 D2,F2,H2の計算結果と、自分で計算した結果があいません。 ここを詳しく教えて頂けないでしょうか。 宜しくお願い致します! INT関数:整数部を返す MOD関数:剰余を返す | A | B | C | D | E | F | G | H | 1| |10000| 5000| 1000| 500| 100| 50 | 10| 2|97810| 9| 1| 2| 1| 3| 0| 1| B2は、98710÷10000=9.7810→整数部を返すので「9」 C2は、97810÷10000=9.7810→剰余7810÷5000=1.562 →整数部を返すので「1」 D2は、97810÷5000=19.562→剰余562÷1000=0.562 →整数部を返すので「0」??? E2は、97810÷1000=97.810→剰余810÷500=1.62 →整数部を返すので「1」 F2は、97810÷500=195.62→剰余62÷100=0.62 →整数部を返すので「0」??? G2は、97810÷100=978.10→剰余10÷50=0.2 →整数部を返すので「0」 H2は、97810÷50=1956.2→剰余2÷10=0.2 →整数部を返すので「0」???
- ベストアンサー
- オフィス系ソフト
- CでOpenMP、パラレル内での共有変数の宣言方法
C言語でOpenMPを利用したとき、parallel構文内で、共有変数を宣言する方法はありますか? OpenMPを利用して、スレッド並列にしたプログラムを書いています。 #pragma omp parallel { ~~ ~~ } この、~~の部分で、大きく分けて二つの処理をしているので、関数に分けました。 #pragma omp parallel private( a, b, c, d, e, f, g, h, i, j ) { func1( a, b, c, d, e, f, g, h ); func2( a, b, c, d, e, f, g, h, i, j ); } このとき、2つ目の関数で共有変数を複数使う必要があります。 しかし、共有変数の数は多く、引数にするとかなりの数の引数になってしまいます。 そこで、できればfunc2()という関数の中で、スレッドで共有できるshared変数を宣言したいのですが、方法がわかりません。 どなたか、知っている方教えてください。
- ベストアンサー
- C・C++・C#
- コブダグラス型効用関数(4つの変数を持つ時)の最適解を教えてください。
経済学のコブダグラス型効用関数の話についてです。 以下のような4つの変数の時,ラグランジュで各変数の最適解は求めるとどのような値になるのでしょうか? (効用最大化つまりUが最大値を取る時のX1~X4の最適な組み合わせを求める問題です。) U=A*X1^b*X2^c*X3^d*X4^e (b+c+d+e=1) s.t.X1*P1+X2*P2+X3*P3+X4*P4=V X1~X4:各財の数量 P1~P4:各財の価格 V:予算制約 A:定数 b,c,d,e:X1~X4に対するパラメーター 一般的な2変数の形(資本K,労働L)だと簡単に理解できるのですが,変数が増えると自信がなくなります(自分の数学の能力の問題だと思うのですが…)。 本当にわからないので焦っています。どなたかわかる方がいらっしゃいましたら御教示下さい。 宜しくお願いします。
- ベストアンサー
- 経済学・経営学
- 日付け毎の最大値
EXCELの表に A B 1 2006/4/1 10:00:00 A 2 2006/4/1 19:00:00 B 3 2006/4/11 11:00:00 C 4 2006/4/11 17:00:00 D 5 2006/10/18 9:00:00 E 6 2006/10/18 20:00:00 F 7 2006/11/11 18:00:00 G のようにA列に日付け/時刻がはいっています。ここから日付けごとの一番遅い時間を抽出したいです。 抽出後は A B 1 2006/4/1 19:00:00 B 2 2006/4/11 17:00:00 D 3 2006/10/18 20:00:00 F 3 2006/11/11 18:00:00 G となります。日付け/時刻を関数で区切るなどして色々試したのですが思うような結果にはなりませんでした。 どなたかご教授お願いします。
- 締切済み
- オフィス系ソフト
- 関数の質問
エクセル2003を使用しています。 下記のシート1に不規則な空白行があり、それをシート2に空白行を詰めて 表示させたいのですがわかりません。 関数でよろしくおねがいいいたします。 シート1 A B C D E F G 1 1 1 1 1 1 1 1 2 3 2 2 2 2 2 2 2 4 3 3 3 3 3 3 3 5 6 7 4 4 4 4 4 4 4 8 9 5 5 5 5 5 5 5 10 11 12 13 6 6 6 6 6 6 6 14 7 7 7 7 7 7 7 15 8 8 8 8 8 8 8 16 9 9 9 9 9 9 9 17 18 シート2 A B C D E F G 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 9 9 9 9 9 9 9 9 10 11 12 13 14 15 16 17 18 ・ ・ ・ ・
- ベストアンサー
- オフィス系ソフト
お礼
わざわざご解答ありがとうございます!下に書いたとおり一応プログラムを見つけれたのでそれで計算したところ最大値は1674と出ましたが、はたして本当にこの値でよいかわかりませんでした。しかし値は正しいこととが確認できたのでどうもありがとうございました。