Defining a mathematical function as the summation of multiple functions

3 次查看(过去 30 天)
Hi,
I want to define the function below in MATLAB and then minimized it using fminsearch.
What I did was to define a loop along with syms function to generate this function and then used matlabFunction() command to convert it to a function.
--------------------------------------------------------------------------------------------------------------------
syms x0 y0 z0 b
S=0;
NumberOfNeighbors=100;
for i = 1:NumberOfNeighbors
Xd=xdata(i,1);
Yd=ydata(i,1);
Zd=zdata(i,1);
Sum=abs(((Xd-x0)^2)+((Yd--y0)^2)+((Zd--z0)^2)-b^2);
S=S+Sum;
end
ht = matlabFunction(S)
Init=[0,0,0,0];
Fmin = fminsearch(ht,Init)
--------------------------------------------------------------------------------------------------------------------
My code worked perfectly, but when I use the generated function as an input in fminsearch, I get the following error message:
"Not enough input arguments."
The reason is that the generated function by the matlabFunction() command is a function of (x0 y0 z0 b), while it should be a function of u(1),u(2),u(3) and u(4).
We are not allowed to define variables of the form u(1),u(2),u(3) and u(4) using syms.
I would appreciate any help that you can provide. Thanks.

采纳的回答

Star Strider
Star Strider 2022-3-31
To get all the arguments as elements of a single vector. use the 'Vars' name-value pair and enclose the arguments in square brackets []:
ht = matlabFunction(S, 'Vars',{[x0,y0,z0,b]})
To see how that works in practice —
xdata = randn(100,1);
ydata = randn(100,1);
zdata = randn(100,1);
syms x0 y0 z0 b
S=0;
NumberOfNeighbors=100;
for i = 1:NumberOfNeighbors
Xd=xdata(i,1);
Yd=ydata(i,1);
Zd=zdata(i,1);
Sum=abs(((Xd-x0)^2)+((Yd--y0)^2)+((Zd--z0)^2)-b^2);
S=S+Sum;
end
ht = matlabFunction(S, 'Vars',{[x0,y0,z0,b]})
ht = function_handle with value:
@(in1)abs((in1(:,1)+6.031542382955758e-1).^2-in1(:,4).^2+(in1(:,3)-4.514357154410683e-1).^2+(in1(:,2)-1.113945828129602).^2)+abs((in1(:,3)-1.45783769930615e-1).^2+(in1(:,1)+1.087893584703542).^2+(in1(:,2)-1.573349894165783).^2-in1(:,4).^2)+abs((in1(:,1)+3.73489278607807e-2).^2+(in1(:,2)+8.421479945678007e-2).^2-in1(:,4).^2+(in1(:,3)-9.53913989327878e-1).^2)+abs((in1(:,2)+1.739400576709651).^2+(in1(:,1)-1.254083115563258).^2-in1(:,4).^2+(in1(:,3)+3.640522000383975e-1).^2)+abs((in1(:,1)+1.420768366051117).^2+(in1(:,2)-2.369807124107065e-1).^2+(in1(:,3)-4.059170202704624e-1).^2-in1(:,4).^2)+abs((in1(:,2)-4.418970545030066e-1).^2-in1(:,4).^2+(in1(:,1)-9.294218879765488e-1).^2+(in1(:,3)-3.909414337345544e-1).^2)+abs((in1(:,2)+5.893359922897708e-1).^2-in1(:,4).^2+(in1(:,1)+4.017260527656553e-1).^2+(in1(:,3)+5.383304350975927e-1).^2)+abs((in1(:,1)-1.005831521757571).^2+(in1(:,3)-2.48584028231891e-1).^2+(in1(:,2)+2.22135632952146).^2-in1(:,4).^2)+abs((in1(:,1)-2.614894839493323).^2+(in1(:,3)+1.68014627666172).^2+(in1(:,2)-8.753995052294088e-1).^2-in1(:,4).^2)+abs((in1(:,2)+4.250057231383061e-1).^2-in1(:,4).^2+(in1(:,3)+5.958307109475643e-1).^2+(in1(:,1)-1.963442762847612).^2)+abs((in1(:,1)+1.361188709078525).^2+(in1(:,2)+1.788579253947234).^2+(in1(:,3)+1.55732668135481).^2-in1(:,4).^2)+abs((in1(:,3)+1.682161641512796).^2-in1(:,4).^2+(in1(:,1)+1.50312354803044).^2+(in1(:,2)-6.137691803445755e-2).^2)+abs((in1(:,2)+1.777935747636345).^2+(in1(:,1)+2.659359288794637e-1).^2-in1(:,4).^2+(in1(:,3)+1.825161793758771e-1).^2)+abs((in1(:,3)+1.383952830502305).^2+(in1(:,1)-1.26483344600822).^2-in1(:,4).^2+(in1(:,2)+6.273348896641698e-1).^2)+abs((in1(:,2)+1.095837479066349).^2+(in1(:,3)+6.077104329760737e-1).^2+(in1(:,1)+9.064717472692025e-1).^2-in1(:,4).^2)+abs((in1(:,2)+1.31879035499212).^2+(in1(:,1)+1.929669660101218e-1).^2+(in1(:,3)+3.732958753983768e-1).^2-in1(:,4).^2)+abs((in1(:,1)-1.200864405758769).^2+(in1(:,2)+6.27206382466213e-2).^2+(in1(:,3)+5.198673963147101e-1).^2-in1(:,4).^2)+abs((in1(:,1)-1.581547044506651).^2-in1(:,4).^2+(in1(:,2)+3.620925494209677e-1).^2+(in1(:,3)-7.044194738397551e-2).^2)+abs((in1(:,3)-6.548227714747618e-1).^2+(in1(:,1)+2.825735466530732e-1).^2+(in1(:,2)+3.259493628823217e-1).^2-in1(:,4).^2)+abs((in1(:,2)+8.921898061332503e-2).^2+(in1(:,1)+3.082275937268097e-1).^2+(in1(:,3)-3.819268521923411e-1).^2-in1(:,4).^2)+abs((in1(:,2)-2.278773605485153e-1).^2+(in1(:,1)-6.792084827277662e-1).^2+(in1(:,3)+1.021268242380771).^2-in1(:,4).^2)+abs((in1(:,3)-3.79371832206307e-1).^2+(in1(:,1)+9.546033119797254e-1).^2-in1(:,4).^2+(in1(:,2)-1.044470930741223).^2)+abs((in1(:,2)-3.278595881747381e-1).^2+(in1(:,1)+1.461312049815205e-1).^2+(in1(:,3)-1.638932662570746).^2-in1(:,4).^2)+abs((in1(:,3)-1.766735366563113).^2-in1(:,4).^2+(in1(:,1)+4.787799542333162e-1).^2+(in1(:,2)-6.395823993438856e-1).^2)+abs((in1(:,3)-1.845733333167634).^2+(in1(:,2)+3.411769508739287e-2).^2+(in1(:,1)-4.783777414294033e-1).^2-in1(:,4).^2)+abs((in1(:,3)+1.457043078662576).^2-in1(:,4).^2+(in1(:,2)+6.483781581359259e-1).^2+(in1(:,1)-1.425926882549134).^2)+abs((in1(:,2)-1.440733474340873e-1).^2+(in1(:,3)-3.207188382667299e-1).^2+(in1(:,1)+8.426540081158101e-1).^2-in1(:,4).^2)+abs((in1(:,3)+3.610479448645704e-1).^2+(in1(:,2)-6.227386698512922e-1).^2+(in1(:,1)+7.528681220823847e-1).^2-in1(:,4).^2)+abs((in1(:,3)+5.479812064743947e-1).^2+(in1(:,1)+1.0483287710631).^2+(in1(:,2)+5.359958852619184e-4).^2-in1(:,4).^2)+abs((in1(:,3)-4.39298391951065e-1).^2+(in1(:,1)+3.629444385673342e-1).^2+(in1(:,2)-4.219839195636151e-1).^2-in1(:,4).^2)+abs((in1(:,1)+1.850306756465896e-1).^2+(in1(:,2)+9.064343571726161e-1).^2-in1(:,4).^2+(in1(:,3)-7.959049051103456e-1).^2)+abs((in1(:,3)+1.19869242299813).^2+(in1(:,2)-8.429389697296127e-1).^2-in1(:,4).^2+(in1(:,1)+2.898944054138064).^2)+abs((in1(:,3)-1.036116495883203).^2+(in1(:,2)+1.26954868098272).^2-in1(:,4).^2+(in1(:,1)-7.880260812273465e-1).^2)+abs((in1(:,2)+1.749780575106909).^2+(in1(:,3)+5.15561660582576e-1).^2-in1(:,4).^2+(in1(:,1)+1.108622159833217e-1).^2)+abs((in1(:,1)+1.279103201379184).^2+(in1(:,2)-3.127398926250695e-1).^2-in1(:,4).^2+(in1(:,3)-7.745531578740871e-1).^2)+abs((in1(:,2)-1.555708032993002).^2+(in1(:,1)-5.693922664792982e-1).^2-in1(:,4).^2+(in1(:,3)+4.871536081882957e-1).^2)+abs((in1(:,2)+2.584045753466138e-1).^2+(in1(:,3)-9.35470686819427e-1).^2-in1(:,4).^2+(in1(:,1)-2.415589178446184e-1).^2)+abs((in1(:,3)-8.007172628545135e-1).^2+(in1(:,1)+3.811013483931354e-1).^2+(in1(:,2)-3.185379809688022e-1).^2-in1(:,4).^2)+abs((in1(:,3)-3.357927323835146e-1).^2+(in1(:,2)+1.130949547274701).^2+(in1(:,1)+6.8617747680658e-1).^2-in1(:,4).^2)+abs((in1(:,3)-7.856936284014074e-1).^2+(in1(:,1)+2.260270318231605e-1).^2-in1(:,4).^2+(in1(:,2)+8.79969513358513e-1).^2)+abs((in1(:,2)-1.309495598598901).^2+(in1(:,1)-7.486826232772817e-1).^2-in1(:,4).^2+(in1(:,3)-3.387412490796151e-1).^2)+abs((in1(:,1)+1.021339881713544).^2-in1(:,4).^2+(in1(:,2)-1.128049502818774).^2+(in1(:,3)-6.388404335532554e-1).^2)+abs((in1(:,3)-7.992923248057919e-2).^2+(in1(:,2)+4.223176716253297e-1).^2-in1(:,4).^2+(in1(:,1)+1.723942982038855e-2).^2)+abs((in1(:,3)+8.805483687555971e-1).^2+(in1(:,1)-8.71219464542484e-1).^2+(in1(:,2)+1.600664982533865e-1).^2-in1(:,4).^2)+abs((in1(:,1)+1.037712101215818).^2+(in1(:,2)-1.945341351130151).^2-in1(:,4).^2+(in1(:,3)-5.371121300212048e-1).^2)+abs((in1(:,2)+4.439319977238837e-1).^2+(in1(:,1)+6.626348615874788e-1).^2+(in1(:,3)+8.223428847467215e-1).^2-in1(:,4).^2)+abs((in1(:,2)+2.598557761976337e-1).^2+(in1(:,1)+2.319150104701994).^2-in1(:,4).^2+(in1(:,3)+1.177823576835883).^2)+abs((in1(:,1)-7.358747094093386e-1).^2+(in1(:,3)+1.514512744614416).^2-in1(:,4).^2+(in1(:,2)-4.516173878426457e-1).^2)+abs((in1(:,2)+4.65173196441807e-1).^2+(in1(:,1)+1.702668131208851).^2-in1(:,4).^2+(in1(:,3)+7.155126238963958e-1).^2)+abs((in1(:,3)-1.680520804030173).^2+(in1(:,2)+6.084251446827007e-1).^2+(in1(:,1)-8.708458784881817e-1).^2-in1(:,4).^2)+abs((in1(:,2)+7.628306279874535e-1).^2+(in1(:,3)-2.885155193806651e-1).^2+(in1(:,1)-5.923553011742246e-1).^2-in1(:,4).^2)+abs((in1(:,1)-1.532986156876533).^2+(in1(:,3)-3.853671976051011e-1).^2-in1(:,4).^2+(in1(:,2)-9.63426289787318e-1).^2)+abs((in1(:,3)+5.687075535794989e-1).^2+(in1(:,2)-4.823847368304289e-1).^2-in1(:,4).^2+(in1(:,1)+8.044311850593071e-2).^2)+abs((in1(:,1)+8.770808943817181e-1).^2+(in1(:,3)-7.533199812568616e-1).^2-in1(:,4).^2+(in1(:,2)+3.613704545958411e-1).^2)+abs((in1(:,2)-2.244941533860216).^2+(in1(:,1)+1.767967564317649).^2-in1(:,4).^2+(in1(:,3)-9.2793031881044e-2).^2)+abs((in1(:,1)-1.149650442911343).^2+(in1(:,2)+9.579270532925499e-1).^2-in1(:,4).^2+(in1(:,3)+2.325592882529798e-1).^2)+abs((in1(:,3)-1.770969677447385e-1).^2+(in1(:,2)-1.270317238652013e-1).^2-in1(:,4).^2+(in1(:,1)+6.331456380213899e-1).^2)+abs((in1(:,1)+5.58876793715162e-1).^2+(in1(:,2)+3.709686504074081e-2).^2+(in1(:,3)-4.972010067301731e-1).^2-in1(:,4).^2)+abs((in1(:,1)+3.645526923833446e-1).^2+(in1(:,2)+8.534122332146028e-1).^2+(in1(:,3)-5.482361899787442e-1).^2-in1(:,4).^2)+abs((in1(:,2)+6.621724285316488e-1).^2+(in1(:,3)-6.238193507028985e-3).^2-in1(:,4).^2+(in1(:,1)-1.519968656938935).^2)+abs((in1(:,1)+9.591607629658131e-1).^2+(in1(:,2)+2.135475715219767e-1).^2-in1(:,4).^2+(in1(:,3)+1.146593952937865e-1).^2)+abs((in1(:,1)+1.83675750293157).^2+(in1(:,2)-1.82115442802279e-1).^2-in1(:,4).^2+(in1(:,3)+9.226654550200927e-1).^2)+abs((in1(:,3)+1.525851506516033).^2+(in1(:,1)+5.982338552084356e-1).^2+(in1(:,2)+6.632792603586978e-1).^2-in1(:,4).^2)+abs((in1(:,2)+1.771360892550024e-1).^2+(in1(:,1)+1.308596965900841).^2+(in1(:,3)+1.128677054600566).^2-in1(:,4).^2)+abs((in1(:,3)+1.42036843763625).^2+(in1(:,2)+2.520332990293411e-2).^2-in1(:,4).^2+(in1(:,1)-1.136120600910209).^2)+abs((in1(:,3)-6.812956344291832e-1).^2+(in1(:,2)+3.160177861630217e-1).^2+(in1(:,1)+1.366703047435726).^2-in1(:,4).^2)+abs((in1(:,3)+1.855241393506674).^2+(in1(:,2)+7.879206089472657e-1).^2-in1(:,4).^2+(in1(:,1)+1.384004297301628).^2)+abs((in1(:,2)-1.776072980078977e-1).^2+(in1(:,1)+7.843482505605791e-1).^2-in1(:,4).^2+(in1(:,3)-3.485306719483294e-1).^2)+abs((in1(:,3)-3.352700857089713e-1).^2+(in1(:,2)+1.116476751771697).^2+(in1(:,1)-5.510105169878272e-1).^2-in1(:,4).^2)+abs((in1(:,1)-5.287847679712725e-1).^2+(in1(:,2)+2.580532567027662e-1).^2-in1(:,4).^2+(in1(:,3)-1.610350192255167e-1).^2)+abs((in1(:,3)+1.154593927663631e-1).^2-in1(:,4).^2+(in1(:,2)-1.013269049041128).^2+(in1(:,1)+4.639336150480445e-1).^2)+abs((in1(:,2)+6.760269044830838e-1).^2+(in1(:,3)-1.850134974440107).^2+(in1(:,1)+9.19950677726953e-1).^2-in1(:,4).^2)+abs((in1(:,3)-6.304380202562485e-1).^2+(in1(:,2)-9.328753779139993e-1).^2-in1(:,4).^2+(in1(:,1)+7.793344025172328e-1).^2)+abs((in1(:,1)+2.864349569668414).^2+(in1(:,3)+1.667535175399621).^2-in1(:,4).^2+(in1(:,2)-1.160006411609129).^2)+abs((in1(:,3)-3.798251750810286e-1).^2+(in1(:,1)+2.001982962774807e-1).^2+(in1(:,2)+4.340966487145883e-1).^2-in1(:,4).^2)+abs((in1(:,3)+1.434806139968263e-1).^2+(in1(:,1)+1.73272583344348).^2+(in1(:,2)+1.255941222932033).^2-in1(:,4).^2)+abs((in1(:,2)-1.782366729918602).^2+(in1(:,3)-1.664138773504831).^2+(in1(:,1)+1.466525150899923).^2-in1(:,4).^2)+abs((in1(:,3)-8.152284181144113e-1).^2+(in1(:,2)+4.963633618936993e-2).^2+(in1(:,1)-1.421581931896251).^2-in1(:,4).^2)+abs((in1(:,3)+8.104133395517478e-1).^2+(in1(:,2)-1.75450037805832).^2+(in1(:,1)-3.094955468092052e-1).^2-in1(:,4).^2)+abs((in1(:,2)-1.352916188458926).^2+(in1(:,3)-5.355401677452235e-1).^2+(in1(:,1)+6.289273805930653e-1).^2-in1(:,4).^2)+abs((in1(:,2)-2.379596754466833e-1).^2+(in1(:,3)-2.130801624014998).^2+(in1(:,1)+2.533414455928281e-1).^2-in1(:,4).^2)+abs((in1(:,3)+3.831517527017279e-1).^2+(in1(:,1)-1.392021299195195).^2+(in1(:,2)+3.155566118173782e-1).^2-in1(:,4).^2)+abs((in1(:,2)-8.158849580237879e-2).^2+(in1(:,3)+7.095785713401557e-1).^2-in1(:,4).^2+(in1(:,1)+1.656200582510875e-1).^2)+abs((in1(:,2)-6.506295920496573e-1).^2+(in1(:,3)-1.378850931981877).^2-in1(:,4).^2+(in1(:,1)-2.913371163942933e-1).^2)+abs((in1(:,3)+5.43511812131464e-1).^2+(in1(:,2)-1.193650199361929).^2+(in1(:,1)+9.326013358897691e-1).^2-in1(:,4).^2)+abs((in1(:,3)-1.25376913901259).^2+(in1(:,2)+1.17012674076671).^2-in1(:,4).^2+(in1(:,1)-5.313065504354205e-1).^2)+abs((in1(:,3)+5.254125343078276e-1).^2+(in1(:,1)-5.55158126541898e-1).^2+(in1(:,2)-2.930711078161298e-1).^2-in1(:,4).^2)+abs((in1(:,2)+1.461252251647627).^2+(in1(:,3)+1.108496623161207).^2-in1(:,4).^2+(in1(:,1)+5.003231999415112e-1).^2)+abs((in1(:,3)-2.399970223748402e-1).^2+(in1(:,1)-3.096003525615665e-1).^2-in1(:,4).^2+(in1(:,2)-7.185311441992477e-1).^2)+abs((in1(:,3)+1.314318464910931).^2+(in1(:,1)+1.09737803133872e-1).^2-in1(:,4).^2+(in1(:,2)+4.069016614242763e-1).^2)+abs((in1(:,1)-1.438189873280947e-1).^2+(in1(:,2)-6.59181765090162e-1).^2-in1(:,4).^2+(in1(:,3)+6.679061104676695e-1).^2)+abs((in1(:,3)-3.320129715836648e-1).^2+(in1(:,2)+1.932888431680579e-1).^2-in1(:,4).^2+(in1(:,1)+1.545766956818623).^2)+abs((in1(:,3)+9.858908931056823e-2).^2+(in1(:,1)-1.421038070431656).^2-in1(:,4).^2+(in1(:,2)+4.213054258491518e-1).^2)+abs((in1(:,3)+6.599205674831305e-1).^2+(in1(:,2)+1.043073578687401).^2-in1(:,4).^2+(in1(:,1)-1.593215088321644).^2)+abs((in1(:,3)-5.262473663775586e-1).^2+(in1(:,2)+1.192173494244443).^2-in1(:,4).^2+(in1(:,1)+1.065805107277744).^2)+abs((in1(:,2)-2.741391264684298e-1).^2+(in1(:,1)-6.016302194456916e-1).^2+(in1(:,3)-4.31249978778074e-1).^2-in1(:,4).^2)+abs((in1(:,3)-6.840798421194227e-1).^2+(in1(:,1)+1.097939879451589e-1).^2+(in1(:,2)-4.652125895096236e-1).^2-in1(:,4).^2)+abs((in1(:,3)-1.385055397715085).^2+(in1(:,1)-6.716385958416079e-1).^2+(in1(:,2)+6.33179342396904e-1).^2-in1(:,4).^2)+abs((in1(:,2)-9.457196966330426e-1).^2+(in1(:,3)-2.361969182680211).^2+(in1(:,1)+8.859427712877517e-1).^2-in1(:,4).^2)+abs((in1(:,1)-1.363868744265735).^2-in1(:,4).^2+(in1(:,2)-7.275679857997771e-1).^2+(in1(:,3)-9.901317438821206e-1).^2)
Init=[0,0,0,0];
Fmin = fminsearch(ht,Init)
Fmin = 1×4
-0.0582 0.0601 -0.1977 -1.5811
Here, the row vector of the input arguments is called ‘in1’ not ‘u’. There does not appear to be a way to change the name.
.

更多回答(1 个)

Jan
Jan 2022-3-31
编辑:Jan 2022-4-4
Why do you want to create the function symbolically? It is easy to define it directly:
ht = @(u1, u2, u3, u4) sum((xdata(:, 1) - u1) .^ 2 + ...
(xdata(:, 2) - u2) .^ 2 + ...
(xdata(:, 3) - u3) .^ 2 - u4 ^ 2);
  6 个评论
Jan
Jan 2022-4-4
Maybe you have to change the function to:
ht = @(u) sum((xdata(:, 1) - u(1)) .^ 2 + ...
(xdata(:, 2) - u(2)) .^ 2 + ...
(xdata(:, 3) - u(3)) .^ 2 - u(4) ^ 2);
with a vector u instead of 4 inputs u1,u2,u3,u4.
Memo Remo
Memo Remo 2022-4-7
Yes. It works now! Thanks for letting me know about this efficient way of defining such function. This is very helpful to speed up the calculations. I appreciate your help.

请先登录,再进行评论。

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by