4 non linear simultaneous equations
조회 수: 2 (최근 30일)
이전 댓글 표시
I have the following 4 questions and want to solve them using fsolve
F(1)=x(1)+x(3)-12.54;
F(2)=x(2)+x(4)-12.245;
F(3)= 2*x(1)+n(2)+n(3)-(1493/60);
F(4) =(x(3)*x(2))/(x(1)*x(4))-1000;
댓글 수: 0
채택된 답변
John BG
2017년 9월 17일
편집: John BG
2017년 9월 17일
Hi Misha
1.
define the function to solve with in for instance a separate file
function F=fun1(x,n)
F(1)=x(1)+x(3)-12.54;
F(2)=x(2)+x(4)-12.245;
F(3)= 2*x(1)+n(2)+n(3)-(1493/60);
F(4) =(x(3)*x(2))/(x(1)*x(4))-1000;
2.
if choosing a single lucky start point, then for instance
f1=@fun1
x0=[1 1 1 1];
n=[1 2 1 2];
options = optimoptions('fsolve','Display','none','PlotFcn',@optimplotfirstorderopt);
f2=@(x) f1(x,n)
Y=fsolve(f2,x0)
Y =
2.9951 4.5133 1.6388 0.0025
3.
Not all start points allow fsolve to start, for instance starting x0 all nulls fsolve returns error
x0=[0 0 0 0];
Y=fsolve(f2,x0)
Error using trustnleqn (line 28)
Objective function is returning undefined values at initial point. FSOLVE cannot continue.
Error in fsolve (line 388)
trustnleqn(funfcn,x,verbosity,gradflag,options,defaultopt,f,JAC,...
4.
A way to understand that there are multiple real roots is changing fsolve options to
.
problem.options = optimoptions('fsolve','Display','none','PlotFcn',@optimplotfirstorderopt);
problem.objective = f2;
problem.x0 = [1 1 1 1];
problem.solver = 'fsolve';
Y=fsolve(problem)
grid on
.
.
Misha, if you find this answer useful would you please consider marking my answer as Accepted Answer?
To any other reader, if you find this answer useful please consider clicking on the thumbs-up vote link
thanks in advance
John BG
댓글 수: 2
John BG
2017년 9월 17일
this is because the start point is really close to x1 x2 x3 x4, and with x1 x4 small, the 4th equation has 1/(x1-x4)
What are the intervals for x?
The roots also change depending upon values of n.
Note I chose first thought of n=[1 2 1 2].
What n values do you use?
Another way:
clear all;clc
syms x1 x2 x3 x4
n2=1;n3=1;
eqs=[x1+x3-12.54, 2+x4-12.245, 2*x1+n2+n3-(1493/60), (x3*x2)/(x1*x4)-1000];
vars=[x1 x2 x3 x4];
S=solve(eqs,vars)
S.x1
=
1373/120
S.x2
=
70331925/659
S.x3
=
659/600
S.x4
=
2049/200
or
clear all;clc
syms x1 x2 x3 x4 y1 y2 y3 y4
n2=1;n3=1;
eqs=[x1+x3-12.54==y1; 2+x4-12.245==y2; 2*x1+n2+n3-(1493/60)==y3; (x3*x2)/(x1*x4)-1000]==y4;
% vars=[x1 x2 x3 x4];
S=solve(eqs,[x1 x2 x3 x4 y1 y2 y3 y4])
Warning: Cannot solve symbolically. Returning a numeric approximation instead.
> In solve (line 304)
S.x1
S.x2
S.x3
S.x4
S.y1
S.y2
S.y3
S.y4
=
-24.422375373098379314336862527351
=
86.546107815420532907149633277211
=
-42.498755958595581747330328897972
=
46.647494915323305014544840322395
=
-79.461131331693961061667191425346
=
36.402494915323305014544840322395
=
-71.728084079530091962007058388033
=
-996.77144989573753535055182388018
note the warning; cannot solve symbolically
With
S = solve(eqs,[x1 x2 x3 x4 y1 y2 y3 y4] , 'IgnoreAnalyticConstraints', true)
S.x1
S.x2
S.x3
S.x4
S.y1
S.y2
S.y3
S.y4
=
1373/120
=
70331925/659
=
659/600
=
2049/200
=
0
=
0
=
0
=
0
Perhaps you will find useful the output constraints that setting parameter ReturnConditions = true obtains
S=solve(eqs,[x1 x2 x3 x4 y1 y2 y3 y4],'ReturnConditions',true)
S =
struct with fields:
x1: [1×1 sym]
x2: [1×1 sym]
x3: [1×1 sym]
x4: [1×1 sym]
y1: [1×1 sym]
y2: [1×1 sym]
y3: [1×1 sym]
y4: [1×1 sym]
parameters: [1×4 sym]
conditions: [1×1 sym]
S.parameters
ans =
[ z, z1, z2, z3]
S.conditions
ans =
300*z2 ~= 600*z1 + 659 & z2 ~= -1373/60 & z ~= -2049/200
S.x1
> S.x1
S.x2
S.x3
S.x4
S.y1
S.y2
S.y3
S.y4
ans =
z2/2 + 1373/120
ans =
((68650*z)/3 + 10245*z2 + (937759*z3)/4000 + 1000*z*z2 + (1373*z*z3)/60 + (2049*z2*z3)/200 + z*z2*z3 + 937759/4)/(2*z1 - z2 + 659/300)
ans =
z1 - z2/2 + 659/600
ans =
z + 2049/200
ans =
z1
ans =
z
ans =
z2
ans =
z3
추가 답변 (1개)
Walter Roberson
2017년 9월 17일
n = rand(1,3); %to have some data to test with
F = @(x) [x(1)+x(3)-12.54;
x(2)+x(4)-12.245;
2*x(1)+n(2)+n(3)-(1493/60);
(x(3)*x(2))/(x(1)*x(4))-1000];
fsolve(F, rand(1,4))
댓글 수: 0
참고 항목
카테고리
Help Center 및 File Exchange에서 Equation Solving에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!