2016-09-01 8 views
1

Octaveで関数を定義したいとします。z(var1, var2) = a(var1) + b(var1) + c(var2) + d(var2) + constこの定義に先立って、a(var1) = var1^2 + constb(var1) = cos(var1)c(var) = sqrt(var2 - const)などのような必要な関数をすべて定義したいと思います。後でこれらの関数をすべて追加して、最後にz関数を作成します。その後、私はvar1var2に関して関数zの偏微分を得たいと思います。Octaveで単純な方程式を書く

私の唯一の関心事は、私が想像しているように上記の機能を定義することです。それは可能でどのようにですか?

+0

シンボリック部分派生または有限差分はOKですか? –

+0

私は、Javaの勾配降下アルゴリズムで最小化される複雑な方程式をテストするためにOctaveを使用しているので、有限の違いのように思われます。また、Octaveはそれを行うためのツールですか、私はMatlabに転送する必要がありますか? – borgmater

+0

Octaveは間違いなく追いついていますが、MATLABは少し速くなるでしょう。個人的には、Pythonに比べると少し厄介なことが分かります。 –

答えて

3

あなたはfunction handlesanonymous functionsを使用することができます。

a = @(x) x^2 + c1; 
b = @cos; 
c = @(x) sqrt(x - c2); 
d = @exp; 

bdは、既存の機能へのハンドルです。 b(...)またはd(...)を使用してそれらを通常の関数として呼び出すことができます。 acは匿名関数です。それらは代入の引数リストとハンドルの定義を提供します。Pythonのlambdasにいくらか似ています。あなたはb = @(x) cos(x)のようなことをすることができますが、追加の操作が必要ないので、本当に意味がありません。

今、あなたは、代替私はあなたが避けたいと仮定していた、機能ごとに別々のM-ファイルを書くことである

z = @(x, y) a(x) + b(x) + c(y) + d(y) + c3; 

を行うことができます。

たとえば偏微分を取るなどの関数を使用すると、かなり簡単になります。楽しみのためだけに、私は、Red Hat 6.5にオクターブ3.4.3を使用して(次のスクリプトを実行した

更新

(z(x + delta, y) - z(x - delta, y))/(2 * delta) 

:関数ハンドルは、他の組み込みまたはm-ファイルに定義された関数のように呼ばれています):

octave:1> c1 = -100; 
octave:2> c2 = -10; 
octave:3> c3 = 42; 
octave:4> a = @(x) x^2 + c1; 
octave:5> b = @cos; 
octave:6> c = @(x) sqrt(x - c2); 
octave:7> d = @exp; 
octave:8> z = @(x, y) a(x) + b(x) + c(y) + d(y) + c3; 
octave:9> [X, Y] = meshgrid([-10:0.1:10], [-10:0.1:10]); 
octave:10> surf(X, Y, z(X, Y)); 

結果は特に興味深いものではありませんが、それはこの技術の有効性を実証します:

enter image description here

ここにはIDEOneのリンクがあります。

+0

あなたの詳細な応答をありがとう、一目でかなりよく見える、私は家に帰るときにそれをテストし、私が成功すれば正しいとマークします:) – borgmater

+0

編集@MadPhysicistを気にしないといいですね。そのプロットは普通の醜い、hahahだった。あなたは*本当にオクターブの古いバージョンを使用している必要がありますか? –

+0

@TasosPapastylianou。わたし。新しいプロットはかなりいいようです。 –

関連する問題