Operator '*' is not supported for operands of type 'function_handle'

3 次查看(过去 30 天)
clear all;
clc;
r_value = 0:.01:.6;
r1 = r_value(:);
Z = [];
for i = 1 : length(r1)
r = r1(i);
i;
Z = [Z;fsolve(@(X)fun(X,r),1)];
end
function gss = fun(X,r)
S = X;
%%
gSq = 1.2;
%%
B = (100)^4;
Zp = 1.1;
Zn = 1.02;
Rp0 = 0.2/197.3;
Rn0 = 0.2/197.3;
%%
mS = 300;
mu = 2.16;
md = 4.67;
%%
pb = r*(197.3)^3;
t = 0;
pp = (1-(2*t))*pb/2;
pn = (1+(2*t))*pb/2;
%%
m1u = mu - gSq.*S;
m1d = md - gSq.*S;
%%
Rp = @(xup,xdp)fsolve(@(rp)f1(rp,xup,m1u,m1d,xdp,B,Zp),Rp0);
Rn = @(xun,xdn)fsolve(@(rn)f2(rn,xun,m1u,m1d,xdn,B,Zn),Rn0);
%%
Aup = @(xup)((sqrt(xup.^2 + (m1u*Rp)^2)) - (m1u*Rp)) ./ ((sqrt(xup.^2 + (m1u*Rp)^2)) + (m1u*Rp));
F1p = @(xup)((xup.*sin(xup)).^2 - Aup(xup).*((sin(xup)).^2 + (xup.*cos(xup)).^2 - (xup.*sin(2.*xup))));
xup = fsolve(@(xup,Rp) F1p(xup), 1);
%%
Aun = @(xun)((sqrt(xun.^2 + (m1u*Rn)^2)) - (m1u*Rn)) ./ ((sqrt(xun.^2 + (m1u*Rn)^2)) + (m1u*Rn));
F1n = @(xun)((xun.*sin(xun)).^2 - Aun(xun).*((sin(xun)).^2 + (xun.*cos(xun)).^2 - (xun.*sin(2.*xun))));
xun = fzero(@(xun) F1n(xun), 1);
%%
Adp = @(xdp)((sqrt(xdp.^2 + (m1d*Rp)^2)) - (m1d*Rp)) ./ ((sqrt(xdp.^2 + (m1d*Rp)^2)) + (m1d*Rp));
F2p = @(xdp)((xdp.*sin(xdp)).^2 - Adp(xdp).*((sin(xdp)).^2 + (xdp.*cos(xdp)).^2 - (xdp.*sin(2.*xdp))));
xdp = fzero(@(xdp) F2p(xdp), 1);
%%
Adn = @(xdn)((sqrt(xdn.^2 + (m1d*Rn)^2)) - (m1d*Rn)) ./ ((sqrt(xdn.^2 + (m1d*Rn)^2)) + (m1d*Rn));
F2n = @(xdn)((xdn.*sin(xdn)).^2 - Adn(xdn).*((sin(xdn)).^2 + (xdn.*cos(xdn)).^2 - (xdn.*sin(2.*xdn))));
xdn = fzero(@(xdn) F2n(xdn), 1);
%%
Oup = sqrt(xup^2 + (m1u*Rp)^2);
Oun = sqrt(xun^2 + (m1u*Rn)^2);
Odp = sqrt(xdp^2 + (m1d*Rp)^2);
Odn = sqrt(xdn^2 + (m1d*Rn)^2);
%%
M1p = (2*Oup + Odp - Zp)/Rp + 4*pi*Rp^3*B/3;
M1n = (2*Odn + Oun - Zn)/Rn + 4*pi*Rn^3*B/3;
%%
Sup = ((Oup/2) + (m1u*Rp*(Oup-1)))/((Oup*(Oup-1)) + (m1u*Rp/2));
Sun = ((Oun/2) + (m1u*Rn*(Oun-1)))/((Oun*(Oun-1)) + (m1u*Rn/2));
Sdp = ((Odp/2) + (m1d*Rp*(Odp-1)))/((Odp*(Odp-1)) + (m1d*Rp/2));
Sdn = ((Odn/2) + (m1d*Rn*(Odn-1)))/((Odn*(Odn-1)) + (m1d*Rn/2));
%%
DMpS = gSq*(2*Sup+Sdp);
DMnS = gSq*(Sun+2*Sdn);
%%
kp = (3*pp*pi^2)^(1/3);
kn = (3*pn*pi^2)^(1/3);
k1p = sqrt(kp^2 + M1p^2);
k1n = sqrt(kn^2 + M1n^2);
%%
Ip = M1p*((M1p^2*log(M1p^2))/4 - (M1p^2*log(kp + k1p))/2 + (kp*k1p)/2);
In = M1n*((M1n^2*log(M1n^2))/4 - (M1n^2*log(kn + k1n))/2 + (kn*k1n)/2);
F = ((1/pi^2) * (1/mS^2) * ((DMpS * Ip) + (DMnS * In))) - S;
gss = F ;
end
%%
function r = f1(rp,xup,m1u,m1d,xdp,B,Zp)
r = ((2*xup^2./sqrt(xup^2 + (m1u.*rp).^2)) + (xdp^2./sqrt(xdp^2 + (m1d.*rp).^2)) - Zp - (4*pi*B.*rp.^4));
end
function r = f2(rn,xun,m1u,m1d,xdn,B,Zn)
r = ((xun^2./sqrt(xun^2 + (m1u.*rn).^2)) + (2*xdn^2./sqrt(xdn^2 + (m1d.*rn).^2)) - Zn - (4*pi*B.*rn.^4));
end
In the above code i want to calculate S. within which we need to calculate xup,xdp,xun,xdn. where the Rp and Rn are again xup,xdp,xun,xdn dependent. I did it in this way but can not able to get result. Could you please help me out in this problem? I'm getting the problem like : "Operator '*' is not supported for operands of type 'function_handle'."

采纳的回答

Star Strider
Star Strider 2023-8-27
The first time this occurs is here (line 35):
Aup = @(xup)((sqrt(xup.^2 + (m1u*Rp)^2)) - (m1u*Rp)) ./ ((sqrt(xup.^2 + (m1u*Rp)^2)) + (m1u*Rp));
where ‘Rp’ has previously been defined as (line 32):
Rp = @(xup,xdp)fsolve(@(rp)f1(rp,xup,m1u,m1d,xdp,B,Zp),Rp0);
Function handles must be evaluated to use them in calculations, so in ‘Rp’ needs to have its arguments stated in order for that to work:
Aup = @(xup)((sqrt(xup.^2 + (m1u*Rp(arg1,arg2))^2)) - (m1u*Rp(arg1,arg2))) ./ ((sqrt(xup.^2 + (m1u*Rp(arg1,arg2))^2)) + (m1u*Rp(arg1,arg2)));
whatever ‘arg1’ and ‘arg2’ are supposed to be.
You will need to go through your code and supply all the arguments to all the function calls in order for your code to work.
.
  2 个评论
pritha
pritha 2023-8-28
Thanks for your reply. I'm trying to look the points you raised. Actually I'm facing problems while handeling 2 fsolve or fzero simultaneously. I'm not at all understanding how can I pose a problem where fsolve will give me a function value and then it continues.
Star Strider
Star Strider 2023-8-28
My pleasure!
I’m not certain what you mean by ‘where fsolve will give me a function value and then it continues’ . You can call fsolve in your code and then use those values in subsequently.
Also, since you already know the value of ‘r1’, this version of the first loop will be more efficient —
Z = zeros(numel(r1),1);
for i = 1 : length(r1)
r = r1(i);
i;
Z(i) = fsolve(@(X)fun(X,r),1);
end
If ‘Z’ is a vector instead of a scalar in each iteration, make appropriate changes to the preallocation dimensions and then the ‘Z’ subscript dimensions in the loop.
.

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Mathematics 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by