• 締切済み

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

みんなの回答

  • Kules
  • ベストアンサー率47% (292/619)
回答No.1

なんだかなあ… これってMatlabの問題なんですかね? 二分法だけ取り上げます。 あなたの参照したページの中では、 「解x*よりも小さい値と大きい値の2つの初期値を与え、その平均値を計算し、この3つのxから得られるyの中で最も小さいxを捨て、新たに平均値を計算するという技法である」 って書いてますね? また、かのwikipediaでは http://ja.wikipedia.org/wiki/%E4%BA%8C%E5%88%86%E6%B3%95 ここでは、f(x) = 0となるxを求める方法について説明する。 1.f(x1)とf(x2)とで符号が異なるような区間下限x1と区間上限x2を定める。 2.x1とx2の中間点xMを求める。 3.f(xM)の符号がf(x1)と同じであればx1をxMで置き換え、f(x2)と同じであればx2をxMで置き換える。 4.2.に戻って操作を繰り返すことにより、f(x) = 0となるxに近づく。 という説明が書かれています。 (Matlab独特の書き方に頼るということをするのでなければ)この文章を愚直にプログラムにおこすだけの話だと思うんですが。プログラムとして難しそうなのは上記手順の3.でしょうか。これもif文の基本的な構文を知っていればできますね。 ちなみに、Matlabには入力値の符号を返す関数signがあるので、これを有効活用してやればよいでしょう。 ニュートン法も同じです。「文章で書かれたことをマジメにプログラムにおこす」この一手です。 「とりあえずこう書いてみたんだけど動かない」とか「こう書いたんだけど時間がかかってしょうがない、もっと高速に出来ないものか」とかであればその点補足いただければより有益な回答が付くのではないかと思われます。 途中厳しいことも書きましたが、参考になれば幸いです。

関連するQ&A

  • 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

  • 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

  • fortran  繰り返しループから抜きたい

    10 continue   :   :   :  do 100 i=1,10 if (abs(x (i)-y(i)) .lt. 1.0) then r= r + dr goto 100 else goto 1000 end if 100 continue :   : : 1000 contiue end   すべての条件(i=1~10)が満足されたら、ループから抜きたいのですが、出来ませんでした。   教えて頂けませんでしょうか?よろしくお願しますね!*<>*!

  • クリックされた地点が2点の線分上かの判定

    bool CheckOnline(int x1,int y1,int x2,int y2,int MouseX,int MouseY){ int range = 10; //許容範囲 double a; double b; if(x2 == x1){ if( abs( MouseX -x1)<range ){ if( abs(MouseY -abs(y2-y1)) <range) return true; } }else{ a=(y2-y1)/(x2-x1); b= y1 - a*x1; if( abs(MouseY - (a * MouseX +b)) <range ){ if( abs(MouseX - ((MouseY-b)/a)) <range ) return true; } } return false; } ぴったりでなく少し誤差があっても線上と判定したいです。 上記の方法ではうまく行きませんでした。 一応、y=ax+bのaとbを求めて、マウスのxとマウスのyを代入 その結果がrange以内かどうかでやってみようとした結果です。

  • 十進BASICでの衝突プログラミング

    十進ベーシック超初心者です。二次元の箱の中に円を置き、そこで衝突を繰り返すプログラムをつくりたいのですが行き詰っています。 箱の中だけでの衝突は、以下のようにプログラムできたのですが、円にぶつかるときどのようにプログラムをくんで跳ね返させればいいかわかりません。どなたか教えて下さい。 SET WINDOW -20,20,-20,20 DRAW GRID(2,2) PLOT LINES: -10,-10 ;10,-10;10,10;-10,10;-10,-10 DRAW CIRCLE WITH SCALE (2) LET X=-10 LET Y=-10 LET T=0 LET V=4.53574748 LET A=56.654968 LET VX=COS(A) LET VY=SIN(A) 100 PLOT LINES:X,Y ; IF VX>0 THEN LET LX=20-(10+X) END IF IF VX<0 THEN LET LX=20-(10-X) END IF IF VY>0 THEN LET LY=20-(10+Y) END IF IF VY<0 THEN LET LY=20-(10-Y) END IF LET T=MIN(LX/ABS(VX),LY/ABS(VY)) LET X=VX*T+X LET Y=VY*T+Y IF T=LX/ABS(VX) THEN LET VX=-VX END IF IF T=LY/ABS(VY) THEN LET VY=-VY END IF GOTO 100 END

  • FORTRANのプログラムです。

    FORTRANのプログラムです。 下に記載したプログラムを、行列値の計算にするプログラムに改良するにはどうすればよいでしょうか? アドバイスお願いします。 c *************************** if(root.LT.x0) GOTO 11 x0=root; x1=xs0; x2=xs1 GOTO 99 11 x0=root; x1=xs0; x2=xs2 GOTO 99 c c *************************** OPEN(6,FILE='sum.dat') 1002 FORMAT(E12.5,3x,4(E12.5,4x)) CLOSE(6) STOP 100 END c ************************* SUBROUTINE FRES(x,F) DOUBLE PRECISION x,F c f=3.*x+DSIN(x)-DEXP(x) f=(x-1.)*(x-2.)*(x-3.)*(x-4.)*(x-5.)*(x-6.) RETURN END よろしくお願いいたします。

  • ボールが壁に当たって跳ね返るプログラムを・・

    スタートボタンを押すと一個のボールが現れ、 picture1の中を動き回り、壁に当たると跳ね返る、 スクリーンセイバーのようなプログラムを作って いるのですが「ボールが壁に当たって跳ね返る」 部分がどうしても上手くいきません。この部分を どなたか教えてください。お願いしますm(_ _)m (見やすいように線を引きました。最後の方が「跳ね返りの部分です。それ以外の部分は、文の長さ制限にひっかかるため省いてあるところがあります。) Private Sub Command1_Click() x = Int(Rnd * 3900) y = Int(Rnd * 3900) r = 100 c = vbRed Timer1.Enabled = True Timer1.Interval = 200 Picture1.Circle (x, y), r, vbRed End Sub ----------------------------------------- Private Sub Timer1_Timer() Picture1.FillColor = Picture1.BackColor Picture1.Circle (x, y), r, Picture1.BackColor dx = 100 dy = dx x = x + dx If x < 0 Then x = 0 And dx = 0 - dx If x > Picture1.Width Then x = Picture1.Width And dx = 0 - dx End If End If y = y + dy If y < 0 Then y = 0 And dy = 0 - dy If y > Picture1.Height Then y = Picture1.Height And dy = 0 - dy End If End If Picture1.FillColor = vbRed Picture1.Circle (x, y), r, vbRed End Sub

  • MATLABの質問です。

    MATLABについての質問です。 大学の研究していてMATLABでわからないところがあるのでぜひ教えて頂けたらと思っています。 よろしくお願い致します。 現在任意の多角形障害物を設置し,それらを回避する折れ線経路を全部求めるところまでできています。その後、全経路からダイクストラの方法で最短折れ線経路を求めたいのですがどのようにプログラムを持っていけばいいか分からず手詰まりしました。 ぜひご指導いただけますでしょうか。 よろしくお願いいたします。 プログラムは動きます。 close all; clc; init=1; final=1000; %図形座標取得 figure(1) for loop=init:final [x,y] = ginput A=[x,y] if 0<=x(:,:)&x(:,:)<=1&0<=y(:,:)&y(:,:)<=1 B{loop} =A else break end end % size(B{i},1) figure(2) for C=init:loop-1 B{C} fill(B{C}(:,1),B{C}(:,2),'g');hold on axis([0,1,0,1]); end [x,y] = ginput pb=[x,y] figure(3) for C=init:loop-1 fill(B{C}(:,1),B{C}(:,2),'g');hold on axis([0,1,0,1]); plot(pb(:,1),pb(:,2),'o');hold on axis([0,1,0,1]); end %図形の辺 k=0; for i=1:loop-1 for p=1:size(B{i},1) for q=p+1:size(B{i},1) k=k+1; obst(k,:) = [B{i}(p,:),B{i}(q,:)]; end end end Pall = pb(1, :); Pall = [Pall; cat(1, B{:})]; Pall = [Pall; pb(2, :)]; %全経路 k=0 for i=1:size(Pall,1) for j=i+1:size(Pall,1) k=k+1; path(k,:) = [Pall(i,:),Pall(j,:)]; point{k}=[i,j]; end end % 交差判定 H=0 for j=1:size(path,1) cflas=1 for i=1:size(obst,1) y1=((obst(i,1)-obst(i,3))*(path(j,2)-obst(i,2))+(obst(i,2)-obst(i,4))*(obst(i,1)-path(j,1))) y2=((obst(i,1)-obst(i,3))*(path(j,4)-obst(i,2))+(obst(i,2)-obst(i,4))*(obst(i,1)-path(j,3))) y3=((path(j,1)-path(j,3))*(obst(i,2)-path(j,2))+(path(j,2)-path(j,4))*(path(j,1)-obst(i,1))) y4=((path(j,1)-path(j,3))*(obst(i,4)-path(j,2))+(path(j,2)-path(j,4))*(path(j,1)-obst(i,3))) Y1=y1*y2 Y2=y3*y4 if Y1<0&&Y2<0 H=H+1 cflas=0 S{j}=[0,0,0,0] S1{j}=[0,0,0,0] end end if cflas==1 X=[path(j,1),path(j,3)]; Y=[path(j,2),path(j,4)]; Xa=[path(j,1),path(j,2)]; Yb=[path(j,3),path(j,4)]; S{j}=[X,Y] S1{j}=[Xa,Yb] plot(X,Y,'-');hold on end end barricade = length(B{1,1}); M=zeros %コストを計算 for k = 1:size(path,1) X1=S{k}(1,1); X2=S{k}(1,3); Y1=S{k}(1,2); Y2=S{k}(1,4); cost{k}=sqrt((X2-X1)^2+(Y2-Y1)^2) M(point{k}(1), point{k}(2) )=cost{k} % if cost{i}==0 % cost{i}=10 % end end M' g=cost{1} for j=1:size(obst,1)+1 if(cost{j}>cost{j+1}) g= cost{j+1} end end

  • 「初心者です」-Xlint: deprecation

    import java.awt.*; import java.applet.*; public class ani_ball extends Applet implements Runnable { Thread th_mvball = null; int X,Y; double x1,y1; double x2,y2; double dx,dy; Graphics g; public void init() { this.setBackground(new Color(150,245,255)); this.X = 250; this.Y = 250; this.setSize(X,Y); this.x1 = this.x2 = this.X/2; this.y1 = this.y2 = this.Y/2; this.dx = 3; this.dy = 2; } public void paint(Graphics g) { g.setColor(Color.red); g.fillOval((int)(this.x2-3),(int)(this.y2-3),6,6); this.x1 = this.x2; this.y1 = this.y2; } public void start() { if(th_mvball == null) { th_mvball = new Thread(this); th_mvball.start(); } } public void run() { while(true) { try { this.move(); this.repaint(); Thread.sleep(10); } catch(InterruptedException e ) { this.stop(); } } } public void move() { if( y2 > Y ) { y2 = 2*Y - y1 - dy; dy = -dy; } else if ( y2 < 0) { y2 = -y1 - dy; dy = -dy; } else if ( x2 > X) { x2 = 2*X - x1 -dx; dx = -dx; } else if ( x2 < 0) { x2 = -x1 - dx; dx = -dx; } if( x2 < 0 ) { x2 = -x2 ; dx = -dx; } else if ( y2 < 0) { y2 = -y2; dy = -dy; } else if ( x2 > X) { x2 = 2*X - x2; dx = -dx; } else if ( y2 > Y) { y2 = 2*Y - y2; dy = -dy; } x2 = x1 + dx; y2 = y1 + dy; } public void stop() { if(th_mvball!=null) { th_mvball stop(); th_mvball=null; } } } ↑のプログラムをコンパイルすると、「-Xlint: deprecation オプションを指定して再コンパイルしてください」とエラーが出ます。 エラーの対処法、またはプログラムの訂正すべき箇所を教えてください。 よろしくお願いします。

    • ベストアンサー
    • Java
  • 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