Defining a mathematical function as the summation of multiple functions

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.

 Akzeptierte Antwort

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.
.

2 Kommentare

Your help is GREATLY appreciated! Thank you very much.
As always, my pleasure!

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

Jan
Jan am 31 Mär. 2022
Bearbeitet: Jan am 4 Apr. 2022
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 Kommentare

Thanks for your help!
If I understood correctly, I need to enter all xdata(:, i) , i=1,2,3,...,n manually using this method. For large values of n, it may not be feasible to do this, which is why I tried to define it symbolically.
Just now got what you tried to say. Yes. This solution works as well. Thank you!
@Memo Remo: I meant, that the shown code can replace the loop to create the function symbolically. So this shown line replaces:
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]})
Dear @Jan,
Yes. At first I couldn't understand your solution, but then I realized that it is a better way to recreate the final function. Thank you very much!
However, when I define the function this way, I get the "Not enough input arguments." error message. I tried to add "@" to the function name in fminsearch, but it did not help.
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.
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.

Melden Sie sich an, um zu kommentieren.

Community Treasure Hunt

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

Start Hunting!

Translated by