多変数関数の最大値

このQ&Aのポイント
  • 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 この問題はどっかの問題集にあったものではなくあるものを求めるために自分で作った問題です。しかしいくらがんばっても自分ではどうすることもできません。この問題はどうすれば解くことができるのでしょうか?この問題を解けるようなフリーソフトを探しましたが見つかりませんでした。もし問題を解けるフリーソフトがあるならそれも教えて欲しいです。

noname#31129
noname#31129

質問者が選んだベストアンサー

  • ベストアンサー
  • rtz
  • ベストアンサー率48% (97/201)
回答No.2

まず、関数を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をとる。 コードを書いた方が簡単だったかも知れない。

noname#31129
質問者

お礼

わざわざご解答ありがとうございます!下に書いたとおり一応プログラムを見つけれたのでそれで計算したところ最大値は1674と出ましたが、はたして本当にこの値でよいかわかりませんでした。しかし値は正しいこととが確認できたのでどうもありがとうございました。

その他の回答 (2)

noname#48504
noname#48504
回答No.3

大概、多変数関数の条件付き極値の問題は、ラグランジュの未定乗数法を用いますが、各変数が整数であり、かつ(この場合は)乗数も定まらないので、プログラミングを使うのが妥当かもしれませんね。 私は専門外ですが、C 言語の for 文を使えば(原理的には)可能かと思います。但し、その前に、(2)(3) の式を e, f についてそれぞれ解いて、f(a, ... , g) に代入し、5変数函数に直した方が良いでしょう。とはいえ、for 文を単純に繰り返し使えば、99^5 = 9509900499 回の計算をしなくてはならなくなるので、時間がかかるかもしれません。

noname#31129
質問者

補足

わざわざご解答ありがとうございます。

  • N64
  • ベストアンサー率25% (160/622)
回答No.1

線形計画法 というキーワードで探してみたらいかがでしょう。

noname#31129
質問者

お礼

線形計画法と打ち込んで検索したところ一応プログラムを見つけることができました。どうもありがとうございました!

関連する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が上記のようになるようにしたいのです。)

  • 関数の基本

    (1)b=f(a),d=g(c)(a≧1)(a,b,c,dは変数) という関数があるとします。g・f(x)=g(f(x))を考えるとき、 xという文字に条件はないからこの関数の定義域は全ての実数でしょうか? それとも、x≧1となるのでしょうか? (2)y=f(x)(x≧1)、b=f(a)(a≧2)という違う文字で定義されていて定義域が異なる関数はありえるのでしょうか? 定義域の意味はあくまでもその関数(f())の独立変数の取りうる値の範囲ということでしょうか? それとも変数ごとに固有というものでしょうか?

  • 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変数を宣言したいのですが、方法がわかりません。 どなたか、知っている方教えてください。

  • コブダグラス型効用関数(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)だと簡単に理解できるのですが,変数が増えると自信がなくなります(自分の数学の能力の問題だと思うのですが…)。 本当にわからないので焦っています。どなたかわかる方がいらっしゃいましたら御教示下さい。 宜しくお願いします。

  • エクセル関数

      A  B  C  D  E  F  G 1 10  1  20  1  30  1  8 2 9 2 0 - 0 - - 3 8 3 15 3 23 3 6 4 5 4 19 2 24 2 7 B=Aの順位 、 D=Cの順位 、 E=A+C 、F=Eの順位 、G=Fの得点 の時 G=Fが1の時8、2の時7・・・8の時1、9以下空白 Cが0(ゼロ)の時Dが空白 Eが0(ゼロ)の時Fが空白 上記の場合の関数をどなたか回答よろしくお願いします。 うまく表示できていませんがCとE以外は1桁の数字で、D,F,Gの-は空白です。

  • 日付け毎の最大値

    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 となります。日付け/時刻を関数で区切るなどして色々試したのですが思うような結果にはなりませんでした。 どなたかご教授お願いします。

  • 関数について。

    実数の定数a,b,c,d,eを係数にもつ2つの関数 f(x)=ax^4+bx^3+cx^2+dx+e g(x)=4ax^2+3bx-2(a-c) を考える。-2≦x≦2を満たす全ての実数xで f(x)≧g(x) であるならば、 max{|a|,|b|,|c|,|d|}≦|e| が成り立つことの証明を教えて下さい。

  • 連続関数

    連続関数f:[a,b]→[c,d],g:[c,d]→[a,b]に対して ∃p∈[a,b],∃q∈[c,d]:f(p)=q∧g(q)=p が成り立つことを示せ という問題が解りません!解る方は教えてください。

  • 関数の質問

    エクセル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 ・ ・ ・ ・