Using fsolve for a set of complex equations

Dear all,
I am now using 'fsolve' to solve a set of nonlinear equations. The equations are very complex and it is difficult to directly write it out. So I hope to firstly assemble it.
dx2 = x2(n)-x(1);
dx1 = x(1);
K1 = k1*(sqrt(2)*(1-dx1)./(dx1.*sqrt((1-dx1).^2+1))-1./dx1+1);
K2 = k2*(sqrt(2)*(1-dx2)./(dx2.*sqrt((1-dx2).^2+1))-1./dx2+1);
K_step = [ K2, -K2;
-K2, K1+K2];
X_step = [x2(n);x(1)];
F_step = [x(2);0];
Then the function to be solved is
fun = @(x) K_step*X_step-F_step;
So the variables appear before the fun @(x). How can I write my codes in this condition? Thank you so much.

Answers (1)

Torsten
Torsten on 2 Apr 2023
Edited: Torsten on 2 Apr 2023
If you want to define K_step*X_step-F_step as a function handle, you will have to define all expressions involving components of x as function handles.
dx2 = @(x)x2(n)-x(1);
dx1 = @(x)x(1);
K1 = @(x)k1*(sqrt(2)*(1-dx1(x))./(dx1(x).*sqrt((1-dx1(x)).^2+1))-1./dx1(x)+1);
K2 = @(x)k2*(sqrt(2)*(1-dx2(x))./(dx2(x).*sqrt((1-dx2(x)).^2+1))-1./dx2(x)+1);
K_step = @(x)[ K2(x), -K2(x);
-K2(x), K1(x)+K2(x)];
X_step = @(x)[x2(n);x(1)];
F_step = @(x)[x(2);0];
fun = @(x)K_step(x)*X_step(x)-F_step(x);
This looks (and is) very ugly.
So I suggest you define a function to compute K_step*X_step-F_step:
fun = @(x)xstep(x,x2,n,k1,k2)
function res = xstep(x,x2,n,k1,k2)
dx2 = x2(n)-x(1);
dx1 = x(1);
K1 = k1*(sqrt(2)*(1-dx1)./(dx1.*sqrt((1-dx1).^2+1))-1./dx1+1);
K2 = k2*(sqrt(2)*(1-dx2)./(dx2.*sqrt((1-dx2).^2+1))-1./dx2+1);
K_step = [ K2, -K2;
-K2, K1+K2];
X_step = [x2(n);x(1)];
F_step = [x(2);0];
res = K_step*X_step-F_step;
end

Categories

Find more on Programming in Help Center and File Exchange

Products

Release

R2021b

Asked:

on 2 Apr 2023

Edited:

on 2 Apr 2023

Community Treasure Hunt

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

Start Hunting!