2015-09-26 142 views
0

我知道,在MATLAB如果聲明MATLAB符號替換

syms x y 
f=x^2+y^2 
grad=gradient(f) 

然後畢業生將存儲值[2*x;2*y]

如果我想在[2;2]評估梯度我用

subs(f,[x;y],[2,2]) 

此退貨[4;4]

我正在編寫一個最陡峭的下降算法,該算法需要足夠通用才能使用任何函數。我想知道如何一般地使用syms和subs。考慮到一些函數可能不會使用我已經聲明的變量,如xy

我知道MATLAB內置fminuncfmincon需要的函數變量定義爲x(1)x(2)x(3) ....因爲這個原因。

我想知道如何使用syms和subs來取變量的函數變量x(1)x(2),...,x(n)

+2

您確定使用符號工具箱實現梯度下降會是明智嗎? – Royi

+0

我不確定,沒有。不過,我認爲這是可能的。 – FOIWATER

+1

這是可能的,但我認爲你不應該。 – Royi

回答

3

看看功能symvar。這將解析一個字符串並從中提取變量名稱(但它不會將v(i)解釋爲向量的一個元素;它將假定這是一個函數)。例如,這是用於解析自定義曲線擬合模型中的變量的相同函數。

funstr = 'x^2+y^2'; 
varcell = symvar(funstr) 

將返回函數的自變量爲一個單元陣列,在字典順序,如果我沒有記錯。

grad = gradient(sym(funstr),varcell); 
varvec = rand(1,length(varcell)); 
gradval = subs(grad,varcell,varvec); 

雖然gradient會給你沒有單元陣列輸入一個梯度(可能使用symvar反正):幸運的是這兩個計算梯度,並隨後替代你可以使用這個單元陣列。通過提供單元陣列varcellsubs,可以對變量的順序進行嚴格控制(這對於替換可能很重要)。

爲了使用戶提供的變量順序與symvar返回的順序相匹配,您仍然必須弄清楚它背後的物流,但這似乎是可行的。你最好的機會可能是計算梯度一次,然後構建一個匿名函數從它使用matlabFunction實際(數字)下降用於:

matlabFunction(grad) 

ans = 

    @(x,y)[x.*2.0;y.*2.0] 

如果問題是輸入變量數,您可以強制matlabFunction接受向量輸入:

matlabFunction(grad,'vars',{sym(varcell)}) 

ans = 

    @(in1)[in1(1,:).*2.0;in1(2,:).*2.0] 

具體原因,只matlabFunction假設向量輸入如果電池的論點有一個象徵性的向量元素,這就是爲什麼我們需要{sym(varcell)}{'x', 'y'}轉換,例如,到{[sym('x'), sym('y')]}

+0

是的,我正在尋找類似的東西。謝謝! – FOIWATER