• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:matlab関数 fminsearbearch()のIDLへの変換 )

MATLAB関数fminsearch()のIDLへの変換方法

このQ&Aのポイント
  • MATLAB関数fminsearch()をIDL言語で実行する方法について教えてください。
  • IDLのFunction Simplex()は最大値の求めることしかできないため、fminsearch()と同じような機能をもつコードを作成したいです。
  • 対象の関数はf(x,y)=sum(abs((XY(x,*)-P(0))^2+(XY(y,*)-P(1))^2-P(2)))です。

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

  • ベストアンサー
  • rabbit_cat
  • ベストアンサー率40% (829/2062)
回答No.1

対象の関数を f(x,y) = -sum(abs((XY(x,*)-P(0))^2+(XY(y,*)-P(1))^2-P(2))) にして(マイナスにする)、最大値を検索すればいいです。 これは、トリッキーでもなんでもなくて、数値計算系のプログラムではいたって普通の方法です。 たいてい、数値計算プログラムでは、最大値検索と、最小値検索のどちらかしか用意されていません。目的関数にマイナスをつければいいだけだからです。 matlabの場合は、IDLとは逆で、fminsearchは用意されていますが、fmaxserachはありません。

romu-
質問者

お礼

ご回答ありがとうございます。 単純なはなしだったのですね。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • MATLABのrbboxについての質問です。

    MATLABのrbboxについての質問です。 MATLABである画像の領域内の情報を取得できるようにしたいのですが、調べてみると、rbboxという関数を使って出来るらしいです。実際にMATLABのHPにあったソースコードを動かしてみると、画像にマウスでドラッグした領域の枠が描かれるのですが、その画像の領域をどうやって処理を行えるように出来るのかがわかりません。出来れば教えてほしいです。rbboxのソースコードを下に示します。宜しくお願いします。 figure; pcolor(peaks); k = waitforbuttonpress; point1 = get(gca,'CurrentPoint'); % ボタンダウンの検出 finalRect = rbbox; % figure単位の出力 point2 = get(gca,'CurrentPoint'); % ボタンアップの検出 point1 = point1(1,1:2); % x と y の抽出 point2 = point2(1,1:2); p1 = min(point1,point2); % 位置と大きさの計算 offset = abs(point1-point2); % x = [p1(1) p1(1)+offset(1) p1(1)+offset(1) p1(1) p1(1)]; y = [p1(2) p1(2) p1(2)+offset(2) p1(2)+offset(2) p1(2)]; hold on axis manual plot(x,y,'r','linewidth',5) % ボックスの回りに選択した領域の描画

  • 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での標準偏差

    MATLABでの標準偏差 MATLABで入力するいくつかの数値の標準偏差が分かっているのですが、 その変数たちで作られる関数の標準偏差を求めることは出来ますか? 例えば、x、yに標準偏差を導入した場合、 f(x、y)の標準偏差をもとめたいのですが。 たとえば、f(x、y)=xyだった場合、 まず、どのように、x、yの標準偏差を導入し、 どのようにfの標準偏差を求めればよいでしょうか? コマンド文を教えてください。

  • Matlabで自作関数をオーバーロード

    Matlabの組み込み関数の中には、引数の数や戻り値の数に応じて異なる作用をするものが沢山あると思います。 例えば組み込みのmax関数だと y=max(x) ならxの第一次元にについての最大値を返しますし、 [y,i]=max(x) なら、さらに i に最大値のindexを代入、 一方 x=max(x,y) ならx,yの各要素について大きい方を取った行列を、 x=max(x,[],d) ならxのd次元についての最大化をしてくれます。 質問ですが、そういう関数を自分で作ることは可能ですか? function [z,w]=f(x,y) という風に関数を定義してしまうと、たとえyを関数中で利用しない場合でも、引数yを指定しなければエラーになってしまいます。同じ関数名でも呼び方に応じて異なった操作をさせることはできないでしょうか?

  • MATLABの関数で配列の要素を返す方法

    現在MATLABについて勉強しているのですが、関数(function)を用いて配列の値を返す方法が分からず困っています。 関数で定義した配列A(m行n列)を用いて、メイン関数で配列の要素Aijを呼び出す、ということがしたいのです。 function y=Func(x)等で1変数や他変数の入出力の仕方は分かります。 どなたか初心者でも理解できるようご教授お願い致します。

  • 二次関数

    こんにちは。 よろしくお願いいたします。 実数x,yの関数P=x^2-2xy+5y^2+6x-14y+5について (1)Pの最小値とそのときのx,yの値を求めよ。 (2)|x|≦2, |y|≦2のとき、Pの最大値・最小値とそのときのx,yの値を求めよ。 (1)はできたのですが、(2)がわかりませんでした。 |x|≦2,|y|≦2すなわち、-2≦x≦2, -2≦y≦2のとき -3≦y-1≦1、 -1≦x-y+3≦7 次の 0≦(y-1)^2≦9,0≦(x-y+3)^2≦49 のところがわかりませんでした。 いきなり[0]が出てきて混乱しています。 教えてください よろしくお願いいたします。

  • ユーザー定義関数の構文がわからない

    以下のコードがあるのですが、コメントがなくて意味がよくわかりません。k = p(1),n = Application.Count(p),t = Sgn(position)というあたりがいきなり見たことのない構文で戸惑ってます。 インターネットでも調べようがありませんでした。 どなたか下のコードにコメントを入れてくれませんでしょうか?ちなみに株式売買のシミュレーション用の関数です。 Function Positioning(position As Single, x As Single, y As Single, p As Range) Dim k As Single, t As Single, r As Single Dim n As Integer, i As Integer If position = 0 Then Positioning = "": Exit Function k = p(1) n = Application.Count(p) t = Sgn(position) If t > 0 Then l = Abs(x): m = -Abs(y) Else l = Abs(y): m = -Abs(x) End If For i = 2 To n r = (p(i) / k - 1) * t If r >= l Or r <= m Then t = 0: Exit For Next If t = 0 Then Positioning = r Else Positioning = "ポジションは解消されていません" End If End Function

  • 2変数関数の極限の証明

    f(x,y)=xy/√(x^2+y^2) (ただしf(0,0)=0と定義) が(x,y)→(0,0)のとき、0に収束することを証明したいのです。しかも|xy/(x^2+y^2)|=<2 という式をその前の小問で証明してるのでそれを用いて証明したいのですが、どなたかヒントをいただけないでしょうか。よろしくお願いします。

  • 二次関数

    実数x,yがx^2+2y^2=4をみたしながら変化するとき、 P=2x^2+2y+y^2の最大値、最小値を求めよ。 この問題のヒントを教えてください。 お願いします。

  • MATLABで二次元フーリエ変換

    画像処理のプログラムを作成しています。参考にしている参考書は【最新MATLABハンドブック】という本です。この本を参考にして、一次元フーリエ変換のプログラムから画像処理の二次元フーリエ変換のプログラムに変更させたいのですが、fft2のところでエラーが出てしまいます。自分なりにプログラムを書き直してみたのですが、fft→fft2に関数変更する以外にもっと根本的なことが必要なのでしょうか? 作成したプログラムはこれです。 clear;close all;n=256;dt=0.005; t=((1:n)-1)*dt; f=t/dt/dt/n;n2=n/2;n2p1=n2+1; X=imread('001.bmp'); X=rgb2gray(X); X=double(X); [m,n]=size(X); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %calc corresponding index number F=50; index=round(F*dt*n+1);index1=(index-1):(index+1); index2=n+2-index1; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %band elminate filter befil=ones(size(X)); befil(index1)=zeros(size(index1)); befil(index2)=zeros(size(index2)); Y=fft2(X);    ←ここでエラーが出ます。 subplot(2,2,1) plot(f,abs(Y)/n2,'r');axis([0 f(n2p1) 0 1]) xlabel('Frequency (Hz)'),ylabel('Magnitude'); title('Original Signal in freq domain'); %%Now apply fft filter in freq domain fftX=fftX.*befil; subplot(2,2,3) plot(f,abs(Y)/n2,'r');axis([0 f(n2p1) 0 1]) xlabel('Frequency (Hz)'),ylabel('Magnitude'); title('filtered Signal in freq domain'); subplot(2,2,2) imaagesc(X),colormap(gray),axis tight; subplot(2,2,4) imagesc(real(ifft2(Y))),colormap(gray),axis tight; 画像の一部分の情報のみを欠落させたいのです。そのためにはバンドエルミネーションフィルタと思ったのですが…もし違うようならご指摘をお願いします。ちなみに001.bmpはカラー画像です。