How to use Fsolve with multiple variables
显示 更早的评论
Hi. I am trying to solve two non-linear equations using fsolve. Here are my two codes:
-------------
function G=Teth3(x,p,H,L);
g=9.82;
mu=0.0141*g;
G=[H-(x(2)/mu).*(cosh(mu.*(x(1)+p)/x(2))-cosh(mu.*x(1)/x(2))); %function G defines a vector of two functions to be solved
L-(x(2)/mu).*(sinh(mu.*(x(1)+p)/x(2))-sinh(mu.*x(1)/x(2)))];
end
-------------
function F = tethsolve3(p,H,L);
x0=[2;2];
g=9.82;
mu=0.0141*g;
[x,fval]=fsolve(@Teth3,x0,p,H,L);
end
-------------
I want the second one (tethsolve3) to get three inputs p, H, L (which will be used as constants) and solve the first function (Teth3) which is a function of x(vector of 2 variables) and p,H,L. I don't know what format I should use for the Fsolve. Please advise. Thank you very much.
2 个评论
LAKKIMSETTI SUNANDA
2021-2-1
Hi. I also have a problem in solving the equations. I have four equations and four unknowns and I have to find those 4 unknown variables. The equations are as follows:
2*Y1*tan(t1_1)+Y2*tan(t2_1)+Y3*tan(t3_1)==0;
2*Y1*tan(t1_3)+Y2*tan(t2_3)+Y3*tan(t3_3)==0;
b1== (t1_1*Y1)+(t2_1*(Y2/2)*((sec(t2_1)^2)/(sec(t1_1)^2)))+(t3_1*(Y3/2)*((sec(t3_1)^2)/(sec(t1_1)^2)));
b3== (t1_3*Y1)+(t2_3*(Y2/2)*((sec(t2_3)^2)/(sec(t1_3)^2)))+(t3_3*(Y3/2)*((sec(t3_3)^2)/(sec(t1_3)^2)));
Here Y1,b1,b3 are known values and the unknown variables are Y2,Y3,l2,l3. The above t1,t2,t3 are in terms of l2 and l3.
t2_1=(2*pi/lambda(1))*l2;
t3_1=(2*pi/lambda(1))*l3;
t2_3=(2*pi/lambda(3))*l2;
t3_3=(2*pi/lambda(3))*l3;
t1_1=(2*pi/lambda(1))*l1;
t1_3=(2*pi/lambda(3))*l1;
Please help me with this. Thank you.
Alan Weiss
2022-1-21
I suggest that you ask your question in a new topic rather than reopening an old topic.
That said, have you tried the Problem-Based Workflow for Solving Equations? It is a very natural way of solving equations.
Alan Weiss
MATLAB mathematical toolbox documentation
采纳的回答
更多回答(4 个)
Manuela Gräfe
2017-4-24
1 个投票
Hello umme mumtahina,
please send me an personal message. I am also interested in the solutions of your questions.
Sometimes you just write: "Got it!", but you don't give the final solution. Due to the fact, that this is a public community, you should provide the corresponding answers to your questions.
So please send me ASAP a personal message.
safi58
2016-11-21
0 个投票
in this paper on page 3284, they have used fsolve to solve those equations. see upper right side.
10 个评论
Walter Roberson
2016-11-21
fsolve() is completely numeric and so would require that you had specific numeric values for all of the symbols.
The fsolve version of your code would be to first give numeric values to everything except x and then define
f = @(x) [x(1)+[[x(1)-x(4)+1]*cos(x(3))+x(2)*sin(x(3))-1]*cos(k*(m-x(3)))+[[-x(1)+(1/x(4))-1]*sin(x(3))+x(2)*cos((3))]*sin(k*(m-x(3)))/k+(1/x(4));
x(2)+[-[x(1)-(1/x(4)+1)]*cos(x(3))-x(2)*sin(x(3))+1]*k*sin(k*(m-x(3)))+[-x(1)+1/x(4)-1]*sin(x(3))+x(2)*cos(x(3));
[-x(1)+1/x(4)-1]*sin(x(3))+x(2)*cos(x(3))-x(2)-n*m;
[[-x(1)+1/x(4)-1]*(1-cos(x(3)))+x(2)*sin(x(3))-x(2)*x(3)+(n*x(3)^2)/2]*((pri^2*R)/m*sec^2*Z)];
guess = rand(1,4); %or some other starting value
X = fsolve(f, guess);
safi58
2016-12-1
编辑:Walter Roberson
2016-12-1
k=0.423;
m=180;
n=0.218;
pri=6;
sec=80;
Z=1.36;R=533.33;
f = @(x) [x(1)+[[x(1)-x(4)+1]*cos(x(3))+x(2)*sin(x(3))-1]*cos(k*(m-x(3)))+[[-x(1)+(1/x(4))-1]*sin(x(3))+x(2)*cos((3))]*sin(k*(m-x(3)))/k+(1/x(4));
x(2)+[-[x(1)-(1/x(4)+1)]*cos(x(3))-x(2)*sin(x(3))+1]*k*sin(k*(m-x(3)))+[-x(1)+1/x(4)-1]*sin(x(3))+x(2)*cos(x(3));
[-x(1)+1/x(4)-1]*sin(x(3))+x(2)*cos(x(3))-x(2)-n*m;
[[-x(1)+1/x(4)-1]*(1-cos(x(3)))+x(2)*sin(x(3))-x(2)*x(3)+(n*x(3)^2)/2]*((pri^2*R)/m*sec^2*Z)];
x0 = [-1 -1 -1 -1]; %or some other starting value
X = fsolve(f, x0);
Hi Walter,
I have run this code but it is showing
Solver stopped prematurely.
fsolve stopped because it exceeded the function evaluation limit,
options.MaxFunEvals = 400 (the default value).
What should I do now?
Walter Roberson
2016-12-1
options = optimoptions(@fsolve, 'MaxFunEvals', 1000);
X = fsolve(f, x0, options);
safi58
2016-12-1
its still not working
Walter Roberson
2016-12-1
If it stopped again saying it was stopping prematurely because of the function evaluation limit and listed the new value that you set, then try again with an even larger value.
If it gave any other message instead please show that message.
safi58
2016-12-1
I tried with this
options = optimoptions(@fsolve, 'MaxFunEvals',2000);
it is showing
Solver stopped prematurely.
fsolve stopped because it exceeded the iteration limit, options.MaxIter = 400 (the default value).
Walter Roberson
2016-12-1
options = optimoptions(@fsolve, 'MaxFunEvals', 1000000, 'MaxIter', 1000000);
safi58
2016-12-4
编辑:Walter Roberson
2016-12-5
Hi Walter,
Sorry to disturb you again and again.
But I am still having problem.
I have done some changes in equations.
Can you please tell me what should be done now?
f =@(x) [x(1)+[[x(1)-(1/x(4))+1]*cos(x(3))+x(2)*sin(x(3))-1]*cos(k*(m-x(3)))+(1/k)*[[-x(1)+(1/x(4))-1]*sin(x(3))+x(2)*cos(x(3))]*sin(k*(m-x(3)))+(1/x(4));
x(2)+[[-x(1)+(1/x(4))-1]*xos(x(3))-x(2)*sin(x(3))+1]*k*sin(k*(m-x(3)))+[[-x(1)+(1/x(4))-1]*sin(x(3))+x(2)*cos(x(3))]*cos(k*(m-x(3)));
[-x(1)+(1/x(4))-1]*sin(x(3))+x(2)*cos(x(3))-x(2)-n*x(3);
[[[-x(1)+1/x(4)-1]*(1-cos(x(3)))+x(2)*sin(x(3))-x(2)*x(3)+(n*x(3)^2)/2]*((pri^2*R)/m*sec^2*Z)]-1];
for these equations it is showing
Undefined function 'xos' for input arguments of type 'double'.
Error in dcmb (line 10)
f =
[x(1)+[[x(1)-(1/x(4))+1]*cos(x(3))+x(2)*sin(x(3))-1]*cos(k*(m-x(3)))+(1/k)*[[-x(1)+(1/x(4))-1]*sin(x(3))+x(2)*cos(x(3))]*sin(k*(m-x(3)))+(1/x(4));
Error in fsolve (line 217)
fuser = feval(funfcn{3},x,varargin{:});
Error in dcmb_driver (line 4)
X = fsolve(@dcmb, x0, optimset('MaxFunEvals',2000,'MaxIter',2000));
Caused by:
Failure in initial user-supplied objective function evaluation. FSOLVE cannot continue.
safi58
2016-12-5
solved it!!!!!!!!
Manuela Gräfe
2017-4-24
Hello umme mumtahina,
please send me an personal message. I am also interested in the solutions of your questions.
Sometimes you just write: "Got it!", but you don't give the final solution. Due to the fact, that this is a public community, you should provide the corresponding answers to your questions.
So please send me ASAP a personal message.
safi58
2016-12-6
0 个投票
Hi Walter, after solving these equations i have found the initial condition. Can you please tell me how to draw these waveforms? see page 3247
GUANGHE HUO
2022-1-21
编辑:Walter Roberson
2022-1-21
for i=1:1:position
global alpha_tspd alpha_trpd beta_d R_pd R_sd Rb_sd T_in
K_sp1=K_mesh_sp(i,1);
K_sp2=K_mesh_sp(i,2);
K_sp3=K_mesh_sp(i,3);
K_rp1=K_mesh_rp(i,1);
K_rp2=K_mesh_rp(i,2);
K_rp3=K_mesh_sp(i,3);
theta_s=Theta_s(i,1);
F=@(x)[ (K_sp1*x(1)*cos(alpha_tspd)-K_rp1*x(4)*cos(alpha_trpd))*cos(beta_d)*R_pd;
(K_sp2*x(2)*cos(alpha_tspd)-K_rp2*x(5)*cos(alpha_trpd))*cos(beta_d)*R_pd;
(K_sp3*x(3)*cos(alpha_tspd)-K_rp3*x(6)*cos(alpha_trpd))*cos(beta_d)*R_pd;
(K_sp1*x(1)+K_sp2*x(2)+K_sp3*x(3))*cos(beta_d)*cos(alpha_tspd)*R_sd-T_in;
x(4)-theta_s*Rb_sd-x(1);
x(5)-theta_s*Rb_sd-x(2);
x(6)-theta_s*Rb_sd-x(3) ];
x0=delta(i,:);
options=optimoptions('fsolve','Algorithm','levenberg-marquardt');
delta(i+1,:)=fsolve(F,x0,options);
end
Hi, above are my code, every time I need to change some variables, but when I run, it shows that no solutions found, fsolve stopped because the last step was ineffective. However, the vector of function
values is not near zero, as measured by the value of the function tolerance.
I do not know why, can someone help me?
8 个评论
Walter Roberson
2022-1-21
As outside observers, we have no reason to believe that there is a solution at all, or that the solution is not complex valued. If we had values for all of the variables we could take a more detailed look.
GUANGHE HUO
2022-1-22
编辑:Walter Roberson
2022-1-22
position=270;
delta=zeros(position,6);
delta_0=[1e-6 1e-6 1e-6 1e-6 1e-6 1e-6]; % Initial value of delta
delta(1,:)=delta_0;
for i=1:1:position
K_sp1=K_mesh_sp(i,1); K_sp2=K_mesh_sp(i,2); K_sp3=K_mesh_sp(i,3);
K_rp1=K_mesh_rp(i,1); K_rp2=K_mesh_rp(i,2); K_rp3=K_mesh_sp(i,3);
theta_s=Theta_s(i,1);
F=@(x)[ (K_sp1*x(1)*cos(alpha_tspd)-K_rp1*x(4)*cos(alpha_trpd))*cos(beta_d)*R_pd;
(K_sp2*x(2)*cos(alpha_tspd)-K_rp2*x(5)*cos(alpha_trpd))*cos(beta_d)*R_pd;
(K_sp3*x(3)*cos(alpha_tspd)-K_rp3*x(6)*cos(alpha_trpd))*cos(beta_d)*R_pd;
(K_sp1*x(1)+K_sp2*x(2)+K_sp3*x(3))*cos(beta_d)*cos(alpha_tspd)*R_sd-T_in;
x(4)-theta_s*Rb_sd-x(1);
x(5)-theta_s*Rb_sd-x(2);
x(6)-theta_s*Rb_sd-x(3) ];
x0=delta(i,:);
options=optimoptions('fsolve','Algorithm','levenberg-marquardt');
delta(i+1,:)=fsolve(F,x0,options);
end
GUANGHE HUO
2022-1-22
Hi, Walter, these are my all variables
GUANGHE HUO
2022-1-22
Rb_sd=0.122867515153017
Walter Roberson
2022-1-22
clearvars
load K_mesh_sp.mat K_mesh_sp
load K_mesh_rp.mat K_mesh_rp
load Theta_s.mat Theta_s
load alpha_tspd.mat alpha_tspd
load alpha_trpd.mat alpha_trpd
load beta_d.mat beta_d
load K_mesh_sp.mat R_pd %not in file R_pd.mat !
load R_sd.mat R_sd
load T_in.mat T_in
syms X [1 6]
Rb_sd=0.122867515153017;
position=270;
delta=zeros(position,6);
delta_0=[1e-6 1e-6 1e-6 1e-6 1e-6 1e-6]; % Initial value of delta
delta(1,:)=delta_0;
for i=1:1:position
K_sp1=K_mesh_sp(i,1); K_sp2=K_mesh_sp(i,2); K_sp3=K_mesh_sp(i,3);
K_rp1=K_mesh_rp(i,1); K_rp2=K_mesh_rp(i,2); K_rp3=K_mesh_sp(i,3);
theta_s=Theta_s(i,1);
F=@(x)[ (K_sp1*x(1)*cos(alpha_tspd)-K_rp1*x(4)*cos(alpha_trpd))*cos(beta_d)*R_pd;
(K_sp2*x(2)*cos(alpha_tspd)-K_rp2*x(5)*cos(alpha_trpd))*cos(beta_d)*R_pd;
(K_sp3*x(3)*cos(alpha_tspd)-K_rp3*x(6)*cos(alpha_trpd))*cos(beta_d)*R_pd;
(K_sp1*x(1)+K_sp2*x(2)+K_sp3*x(3))*cos(beta_d)*cos(alpha_tspd)*R_sd-T_in;
x(4)-theta_s*Rb_sd-x(1);
x(5)-theta_s*Rb_sd-x(2);
x(6)-theta_s*Rb_sd-x(3) ];
x0=delta(i,:);
options=optimoptions('fsolve','Algorithm','levenberg-marquardt');
T1 = F(X);
sol = solve(T1([1:3 5:7]), X)
T2 = subs(T1(4), sol)
assert(isAlways(T2 == 0, 'unknown', 'true'), 'seventh equation fail')
delta(i+1,:)=fsolve(F,x0,options);
end
You will get seventh equation fail in the first iteration.
The last three equations are of the form Xi - Xj which forces Xi and Xj to be the same. Substitute those equalities into the first three equations and you get equations that are all linear in a single variable and the right hand side of the equation is 0. When a linear multiple of a variable must be equal to 0, then it forces the variable to be equal to 0. So the first three variables must be 0 and the last 3 variables must be the same as the first three variables and so must equal 0 as well. This leaves you with one equation out of the 7, and if you substitute in all 0 for the variables there, you get something that cannot possibly be 0.
So, at least for the first round, the equations are inconsistent.
GUANGHE HUO
2022-1-23
So, my problem is my equation, my equations must be checked
Walter Roberson
2022-1-24
x(4)-theta_s*Rb_sd-x(1);
x(5)-theta_s*Rb_sd-x(2);
x(6)-theta_s*Rb_sd-x(3) ];
If theta_s happened to be 0, then those force equality relationships.
If theta_s were non-zero then those force simple linear relationships that you can substitute into the first four equations.
syms x [1 6]
syms alpha_trpd alpha_tspd beta_d K_rp1 K_rp2 K_rp3 K_sp1 K_sp2 K_sp3 R_pd R_sd Rb_sd T_in theta_s
eqn = [ (K_sp1*x(1)*cos(alpha_tspd)-K_rp1*x(4)*cos(alpha_trpd))*cos(beta_d)*R_pd;
(K_sp2*x(2)*cos(alpha_tspd)-K_rp2*x(5)*cos(alpha_trpd))*cos(beta_d)*R_pd;
(K_sp3*x(3)*cos(alpha_tspd)-K_rp3*x(6)*cos(alpha_trpd))*cos(beta_d)*R_pd;
(K_sp1*x(1)+K_sp2*x(2)+K_sp3*x(3))*cos(beta_d)*cos(alpha_tspd)*R_sd-T_in;
x(4)-theta_s*Rb_sd-x(1);
x(5)-theta_s*Rb_sd-x(2);
x(6)-theta_s*Rb_sd-x(3) ]
sol = solve(eqn([1:3 5:end]), x)
eqn4 = subs(eqn(4), sol)
In order for the system of equations to hold, that eqn4 would have to hold. It is independent of the x values: if it holds then there is a solution to the system, and if it does not hold then there is no solution to the system.
类别
在 帮助中心 和 File Exchange 中查找有关 Mathematics 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!

