看看功能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
反正):幸運的是這兩個計算梯度,並隨後替代你可以使用這個單元陣列。通過提供單元陣列varcell
至subs
,可以對變量的順序進行嚴格控制(這對於替換可能很重要)。
爲了使用戶提供的變量順序與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')]}
。
您確定使用符號工具箱實現梯度下降會是明智嗎? – Royi
我不確定,沒有。不過,我認爲這是可能的。 – FOIWATER
這是可能的,但我認爲你不應該。 – Royi