Maltabについて3

このQ&Aのポイント
  • 2変数の極地問題について、プログラムを書く方法
  • 具体的には、fortranで書かれたプログラムを参考にしています。
  • プログラムを実行すると、次の解が求まります。
回答を見る
  • ベストアンサー

Maltabについて3

2変数の極地問題について、どのようにプログラムを書けばいいのでしょうか? 具体的には、fortranでは、以下のように書かれているのですが、、、 次のzがなる時のxとyは? z=-x^2+5x-2y^2+2y+2 (以下のページ http://www8.plala.or.jp/uemura/sim2.html を参照しています。) DOUBLE PRECISION X,Y,H,MAXZ,Z1,Z2,Z3,Z X=0 !xの初期値 Y=0 !yの初期値 H = 0.1 !ステップ幅 MAXZ = -100000 100 Z1 = Z(X, Y) Z2 = Z(X + H, Y) Z3 = Z(X, Y + H) IF (Z2.GT.Z1.AND.Z2.GT.Z3) THEN  MAXZ = Z2  X = X + H  GOTO 100 END IF IF (Z3.GT.Z1.AND.Z3.GT.Z2) THEN  MAXZ = Z3  Y = Y + H  GOTO 100 END IF IF (Z1.GE.Z2.AND.Z1.GE.Z3) THEN  H = H / 10  IF (H.GT..000001) GOTO 200  GOTO 100 END IF 200 WRITE(*,*) 'X*= ', X WRITE(*,*) 'Y*= ',Y WRITE(*,*) 'Z*= ',Z1 END DOUBLE PRECISION FUNCTION Z(X,Y) DOUBLE PRECISION X,Y Z=-X**2+5*X-2*Y**2+2*Y+2 END これを実行すると次の解が求まる。 X*= 2.500000037252903 Y*= 5.000000074505806E-001 Z*= 8.749999999999998

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

  • ベストアンサー
回答No.1

「 fminsearch()。極大値を出す場合は関数符号を要反転。 http://www.mathworks.co.jp/help/ja_JP/techdoc/ref/fminsearch.html zz=@(x) -( -x(1)^2+5*x(1)-2*x(2)^2+2*x(2)+2 ) y=fminsearch(zz,[1 1]) - zz(y) 」 という回答が他のサイトに上がっていますね。 多数同時に聞いて、一カ所で解決したら,他のところにも回答を書いてお礼を書いておくとよいのではないでしょうか?

参考URL:
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1079164320

関連するQ&A

  • Matlabについて質問2

    二分法とニュートン法について、どのようにプログラムを書けばいいのでしょうか? 具体的には、fortranでは、以下のように書かれているのですが、、、 y=-x^2+5x+2 (以下のページ http://www8.plala.or.jp/uemura/sim2.html を参照しています。) (二分法) DOUBLE PRECISION X,AX,X1,X2,Y1,Y2,YA,Y X=1 H=0.1 X1=0 !低い方のxの初期値 X2=5 !高い方のxの初期値 100 AX = (X1 + X2) / 2 !2つの初期値の平均 Y1 = Y(X1) Y2 = Y(X2) YA = Y(AX) IF (YA.EQ.Y1.AND.YA.EQ.Y2) GOTO 200 IF (Y1.GE.Y2) THEN  X2 = AX  GOTO 100 END IF IF (Y2.GE.Y1) THEN  X1 = AX  GOTO 100 END IF 200 WRITE(*,*) 'X*= ', X1 WRITE(*,*) 'Y*= ', Y1 END DOUBLE PRECISION FUNCTION Y(X) DOUBLE PRECISION X Y=-X**2+5*X+2 END これを実行すると以下のようになる。 X*= 2.499999981373549 Y*= 8.250000000000000 (ニュートン法) DOUBLE PRECISION X,H,DY1,DY2,DY3,Y1,Y,DY X=1 !xの初期値 H=0.1 !ステップ幅の初期値 100 DY1 = DY(X) DY2 = DY(X + H) DY3 = DY(X - H) IF (ABS(DY1).LT..000001) GOTO 200 !収束判定 IF (ABS(DY2).LT.ABS(DY1).AND.ABS(DY2).LT.ABS(DY3)) THEN  X = X + H  GOTO 100 END IF IF (ABS(DY3).LT.ABS(DY1).AND.ABS(DY3).LT.ABS(DY2)) THEN  X = X - H  GOTO 100 END IF IF (ABS(DY1).LE.ABS(DY2).AND.ABS(DY1).LE.ABS(DY3)) THEN  H = H / 10  GOTO 100 END IF 200 Y1 = Y(X) WRITE(*,*) 'X*= ',X WRITE(*,*) 'Y*= ',Y1 END DOUBLE PRECISION FUNCTION Y(X) DOUBLE PRECISION X Y=-X**2+5*X+2 END DOUBLE PRECISION FUNCTION DY(X) !微分式の定義 DOUBLE PRECISION X DY=-2*X+5 END これを実行すれば以下のようになる。 X*= 2.500000022351742 Y*= 8.250000000000000

  • Matlabについて質問

    制約条件付きの最大化は、どのようにプログラムを書けばいいのでしょうか? 具体的には、fortranでは、以下のように書かれているのですが、、、 (以下のページの(3.家計行動) http://www8.plala.or.jp/uemura/sim2.html を参照しています。) DOUBLE PRECISION ALPHA,BETA,PX,PY,I,X,H,MAXU,Y,U ALPHA=0.4 !α BETA=0.6 !β PX=3 !px PY=2 !py I=100 !予算 X=0 !xの初期値 H=1 !ステップ幅 MAXU=0 100 Y=(I-PX*X)/PY !予算制約 U =X**ALPHA*Y**BETA !効用関数 IF (U.GE.MAXU) THEN  MAXU = U  X = X + H  GOTO 100 END IF IF (U.LT.MAXU) THEN  X = X - H  H = H / 10  IF (H.LT..000001) GOTO 200 !収束判定  X = X + H  GOTO 100 END IF 200 WRITE(*,*) 'X*= ',X WRITE(*,*) 'Y*= ',Y WRITE(*,*) 'U*= ',U END これを実行すると、次のようになる。 X*= 13.333332999999990 Y*= 29.999999000000010 U*= 21.689437517636550

  • 08年センター試験本試数学Bコンピュータ

    以下はユークリッドの互除法という自然数x,yの最大公約数を求めるためのプログラムです。 センター試験の問題では、130~150行目が空欄になっていて、その部分に当てはまるものは何か問うていました。 私は勉強不足で、高校で学ぶコンピュータプログラミングを知りません。 ユークリッドの互除法といえば、130~150行目は 130 LET Z=X 140 LET X=Y 150 LET Y=Z と、即答できねばいけないものなのでしょうか。 それともこの部分は考えて求められるものなのでしょうか。 もし後者であれば、その考える道筋を解説していただきたいです。 100 INPUT "x=";X 110 INPUT "y=";Y 120 IF X<Y THEN 130 LET Z=X 140 LET X=Y 150 LET Y=Z 160 END IF 170 IF Y=0 THEN 180 PRINT X 190 GOTO 270 200 END IF 210 LET R=X 220 LET R=R-Y 230 IF R>=Y THEN GOTO 220 240 LET X=Y 250 LET Y=R 260 GOTO 170 270 END

  • VB IF なぜ構文エラーにならないのですか?

    Dim x, y, z As Integer x = 1 y = 1 z = 1 If x = y And y = z Then MessageBox.Show("OK") End If 3つの値が同じならアラートを出したいのです。このソースでできるかとおもいます。。。 しかし・・・・ If x = y = z Then MessageBox.Show("OK") End If とするとアラートが出ません。関数的に使い方が間違っているのでしょうか? もしそうならなぜ構文エラーが出ないのでしょうか? よろしくお願いします。 言語Microsoft Visual Basic 2008 Express Edition

  • VBA と JIS Full BASIC

     下のJIS Full Basic スタイルとだいたい同じようなコードを VBA で書いたのですが   Z = Sqr(x^2 + y^2) のところでエラーが出ます。どこがおかしいのでしょうか。 Function gcd(a, b)   Do While b <> 0    r = a Mod b    a = b    b = r   Loop   gcd = a End Function Rem 既約なピタゴラス数を求める Sub Pythagoras()  LAST = 200   LAST = 200   For x = 1 To LAST    For y = x + 1 To LAST      Z = Sqr(x^2 + y^2)      'ここでコンパイルエラーが出る      If Int(Z) = Z Then       If gcd(x, y) = 1 And gcd(x, z) = 1 And gcd(y, z) = 1 Then         Debug.Print x & ", " & y & ", " & z       End If      End If    Next y   Next x End Sub ---------------------------- JIS Full Basic スタイルのコード REM ピタゴラス数 FUNCTION gcd(a,b)   DO WHILE b <> 0    LET r = MOD(a,b)    LET a = b    LET b = r   LOOP   LET gcd = a END FUNCTION LET LAST = 200 FOR x = 1 TO LAST   FOR y = x + 1 TO LAST    LET z = SQR(x^2+y^2)    IF INT(z) = z THEN      IF gcd(x,y) = 1 AND gcd(x,z) = 1 AND gcd(y,z) = 1 THEN       PRINT x,y,z      END IF    END IF   NEXT y NEXT x END

  • mの平方根の連分数展開なのですがうまく動きません。

    subroutine keisan(m) integer a,a0,n,i,m real t,X,Y,Z t=sqrt(real(m)) a0=int(t) write(*,*) 'a0=',a0 a=a0 X=1 Y=0 Z=1 do 10 n=1,20 if (Z==0.0) exit X=X*Z Y=Z*(-Y+real(a)*Z) Z=X*X*real(m)-(real(a)*Z-Y)**2 do 100 i=1,X if(real(i)==X) then X=X else if(((mod(int(X),i))==0).AND.((mod(int(Y),i))==0).AND.((mod(int(Z),i))==0)) then X=X/real(i) Y=Y/real(i) Z=Z/real(i) else X=X endif endif 100 continue a=int((X*t+Y)/Z) write(*,*) 'a',n,'=',a 10 continue end subroutine サブルーチンのみ載せてますけど・・・・どうなのでしょう??

  • フォートランですが。。

    以下のように関数を定義したのですが、 double precision function theata(x, u, ns, i) のところでwarningがでて、"関数の戻り値が定義されていない"みたいなことを言ってるんですが、何がいけないのでしょう? double precision function theata(x, u, ns, i) implicit double precision(a-h, o-z) dimension y(51), u(51) do 100 i=1, ns y(i)=cos(x)-sin(u(i)) 100 continue return end

  • CORDICによるSIN/COSの計算

    題目のアルゴリズムの計算をプログラムしましたが、期待値と 計算値が合いません。 誤りを指摘してください。 REM calculation of sin and cos by CORDIC k = 1 / .60725 z = .65 GOSUB 1000 PRINT "cos(z)="; x PRINT "sin(z)="; y END 1000 REM sin(z) , cos(z) x = 1 / k y = 0 i = 0 1010 IF z >= 0 THEN 1200 u = x + y * 2 ^ (-i) y = y - x * 2 ^ (-i) z = z + atan(2 ^ (-i)) x = u GOTO 1400 1200 u = x - y * 2 ^ (-i) y = y + x * 2 ^ (-i) z = z - atan(2 ^ (-i)) x = u 1400 i = i + 1 IF i < n THEN 1010 RETURN アルゴリズムの出展は ディジタル信号による通信システム設計 P138 図3-36 CQ出版社

  • Excel VBA 条件分岐のスマートな書き方

    すみません。すごく初歩的な質問なのですが、 Excel VBAで以下のような条件分岐をさせたい場合、 もっとスマートな書き方できませんか? 命題 AとBに対して if not A then 処理X end if if not B then 処理Y end if if not(A and B) then 処理Z(この処理の中には処理Xと処理Yの結果が含まれている) end elseifを使った書き方が思い浮かばず、 同じことを何度も書いているようで、もっと上手に書けそうな気がしまして・・・ どなたかご教示頂けたらと思います。

  • 配列表示と間引き

    配列の間引きをを教えて下さい。 下記文を書きました Sub 配列() Dim u As Integer '左 Dim v As Integer '中 Dim w As Integer '右 Dim x As Integer '左 Dim y As Integer '中 Dim z As Integer '右 Dim row As Integer '行カウンタ Dim col As Integer '列カウンタ Dim intSheet As Integer 'シートカウンタ Dim blnNextPage As Boolean '次シートフラグ '初期値セット u = 1 v = 2 w = 3 x = 4 y = 5 z = 5 row = 0 col = 1 intSheet = 1 Do While (1) 'zカウント z = z + 1 If z > 20 Then 'zが20以上ならy+1 y = y + 1 If y > 19 Then 'yが20以上ならx+1 x = x + 1 If x > 18 Then 'xが20以上ならy+1 w = w + 1 If w > 17 Then 'wが20以上ならx+1 v = v + 1 If v > 16 Then 'wが20以上ならx+1 u = u + 1 '終了条件 If (x = 19 And y = 19 And z = 20) Then Exit Do 'v初期化 = x+1 v = u + 1 End If 'w初期化 = y+1 w = v + 1 End If 'x初期化 = x+1 x = w + 1 End If 'y初期化 = y+1 y = x + 1 End If 'z初期化 = y+1 z = y + 1 End If If z > 20 Then Exit Sub '行カウント row = row + 1 If row > 1000 Then '1000で次の列か次のページへ If blnNextPage Then '行・列カウンタ初期化 col = 1 row = 1 '次のシートへ intSheet = intSheet + 1 '次のシートが無い場合は追加 If intSheet > Worksheets.Count Then Sheets.Add After:=Worksheets(Worksheets.Count) End If 'シートをアクティブに Worksheets(intSheet).Select 'フラグ消去 blnNextPage = False Else '次の列へ col = col + 6 row = 1 'blnNextPage = True End If End If If col = 6 * 3 + 1 Then blnNextPage = True End If 'データ表示 Worksheets(intSheet).Range(Chr(64 + col) & row).Cells = u Worksheets(intSheet).Range(Chr(64 + col + 1) & row).Cells = v Worksheets(intSheet).Range(Chr(64 + col + 2) & row).Cells = w Worksheets(intSheet).Range(Chr(64 + col + 3) & row).Cells = x Worksheets(intSheet).Range(Chr(64 + col + 4) & row).Cells = y Worksheets(intSheet).Range(Chr(64 + col + 5) & row).Cells = z Loop End Sub 上記文で表示をしますが、 6列目までの間に3列の連数字の時には表示を行わず、次に移る様にしたいのですが、どうすれば良いでしょうか? 1,2,5,6,10,12はOKです 1,2,3,5,6,10又は1,3,4,5,10,11等3連の数字は表示を行わない。

専門家に質問してみよう