Solving nonlinear system of equations with different variables

Hello
I would like to solve a nonlinear system of equations. Im new to matlab and therefore i dont have enough experience to get this problem solved by myself.
i have googled around a bit but unfortunately didnt got the hint that i needed. Therefore i write now here in this community.
I hope someone can help me.
Here is my problem:
function F = root2d(x)
F(1) = (R1*(C2+C3) + R2*(C1+C2) + R3*C3*(1-1 / ( R5 / (R4+R5))))-0.24792;
F(2) = (R1*R2*(C1*C2 + C1*C3 +C2*C3)+R1*R3*C2*C3 +R2*R3*(C1+C2)*C3*(1-1 / ( R5 / (R4+R5)) ))-0.7807;
F(3) = (R1*C1*R2*C2*R3*C3)-0.0948;
F(4) = ((R1*C1*R2*C2*R3*C3)/ ( R5 / (R4+R5)) )-0.948;
end
I would like to find solutions for
R1, R2, R3, C1, C2, C3
R4 and R5 are known. R4 is 1 and R5 is 9.
How do i have to solve this system?
I have tried it that way:
fun = @root2d;
x0 = [1,1,1,1];
x = fsolve(fun,x0)
function F = root2d(x)
F(1) = (R1*(C2+C3) + R2*(C1+C2) + R3*C3*(1-1 / ( R5 / (R4+R5))))-0.24792;
F(2) = (R1*R2*(C1*C2 + C1*C3 +C2*C3)+R1*R3*C2*C3 +R2*R3*(C1+C2)*C3*(1-1 / ( R5 / (R4+R5)) ))-0.7807;
F(3) = (R1*C1*R2*C2*R3*C3)-0.0948;
F(4) = ((R1*C1*R2*C2*R3*C3)/ ( R5 / (R4+R5)) )-0.948;
end
but it tells me that it was not able to find any solutions.
Thanks in advance.
Regards

 Accepted Answer

You have 4 equations that you want to solve for 6 variables. There will either be no solutions or an infinite number of solutions.
In your case, there are no solutions.
If you solve the first three equations for R1, R2, R3, you can do that by expressing R2 as the roots of a degree 6 polynomial, and then expressing R1 and R3 in terms of that; for example,
R1 = (4740 - 50000*C1^3*R2^3 + (-100000*C2*R2^3 + 12396*R2^2)*C1^2 + (-50000*C2^2*R2^3 + 12396*C2*R2^2 - 39035*R2)*C1)*`/`(50000*C1*C2^2*R2^2)
However, when you then substitute the R1, R2, R3 solutions into the fourth equation, you get out -316/375 instead of an equation in multiple variables. Your equations are rank deficient and inconsistent.

6 Comments

Since this appears to describe an electrical circuit, maybe there is a typo in your equations, so that the inconsistency could be resolved by correcting the equations.
Look at your equations:
F(3) = (R1*C1*R2*C2*R3*C3)-0.0948;
F(4) = ((R1*C1*R2*C2*R3*C3)/ ( R5 / (R4+R5)) )-0.948;
Notice that (R1*C1*R2*C2*R3*C3) is the same in both of them and that the -0.0948 is the same on both of them. We can substitute that 0.0948 that (R1*C1*R2*C2*R3*C3) must equal from the third equation into the 4th one:
F(4) = 0.0948/( R5 / (R4+R5)) ) - 0.948
and we can see that the only way that can work is if (R5 / (R4+R5)) = 1. So what is needed for R5/(R4+R5) to equal 1? Easy: that R5 is non-zero and R4 is 0. But R4 was given and is 1. R5/(1+R5) = 1 implies R5 = 1*(1+R5) implies R5 = 1 + R5 implies 0 = 1. So we have a contradiction and so F(3) and F(4) cannot be simultaneously true.
Thanks for your answer.
F3 and F4 does not have the same coefficients.
F3 has 0.09 and F4 as 0.9...
Madhan ravi has posted the correct answer but he has deleted his answer a few minutes ago.
i dont know why he did that. but here is his answer which is absolutely correct for my problem:
fun = @root2d;
x0 = [1;1;1;1;1;1]; % 6 guesses needed
x = lsqnonlin(fun,x0) % used in place of fsolve but the result was the same because it showed using Levenberg-Marquardt algorithm instead.
function F = root2d(x)
R4=9;
R5=1;
R1=x(1);
R2=x(2);
R3=x(3);
C1=x(4);
C2=x(5);
C3=x(6);
F(1) = (R1*(C2+C3) + R2*(C1+C2) + R3*C3*(1-1 / ( R5 / (R4+R5))))-0.24792;
F(2) = (R1*R2*(C1*C2 + C1*C3 +C2*C3)+R1*R3*C2*C3 +R2*R3*(C1+C2)*C3*(1-1 / ( R5 / (R4+R5)) ))-0.7807;
F(3) = (R1*C1*R2*C2*R3*C3)-0.0948;
F(4) = ((R1*C1*R2*C2*R3*C3)/ ( R5 / (R4+R5)) )-0.948;
end
if you insert the solutions you get into your function, the result for all equations should be very near to zero. This is not the case - i think you are wrong and should follow Walters suggestion.
I deleted my answer because it was clearly stated that No solution found which by the way I didn’t notice clearly at the moment until sir Walter stated it.
Hi Walter, you are right. I now see the problem.
I just have to choose some start values for the capacitors. and then i can solve the linear system. Thanks

Sign in to comment.

More Answers (2)

Claudio, no, I'm sorry, but you do not have the answer. Lets look at your equations.
syms R1 R2 R3 C1 C2 C3
R4 = 9;
R5 = 1;
F(1) = (R1*(C2+C3) + R2*(C1+C2) + R3*C3*(1-1 / ( R5 / (R4+R5))))-0.24792;
F(2) = (R1*R2*(C1*C2 + C1*C3 +C2*C3)+R1*R3*C2*C3 +R2*R3*(C1+C2)*C3*(1-1 / ( R5 / (R4+R5)) ))-0.7807;
F(3) = (R1*C1*R2*C2*R3*C3)-0.0948;
F(4) = ((R1*C1*R2*C2*R3*C3)/ ( R5 / (R4+R5)) )-0.948;
pretty(F(3))
237
C1 C2 C3 R1 R2 R3 - ----
2500
>> pretty(F(4))
237
10 C1 C2 C3 R1 R2 R3 - ---
250
Do you notice anything strange about the last two equations? Ie., that they are identical?
F(3) tells us that the product of all 6 unknowns is 237/2500.
F(4) tells us that the product of all 6 unknowns, when multiplied by 10, is 237/250. Is that any surprise?
I suppose you could create a few more equations, multiplying them by any constant factor you wish. It would still be the very same equation. NO different.
So you have only 3 distinct equations. We can ignore the 4th completely. You have 6 unknowns. You can pick 3 of them to arbitrarily set to any fixed constants. Now, can we solve for three of those unknowns, in terms of the others? We can try, but we will hit a dead end of some sorts.
R123 = solve(F(1:3),[R1,R2,R3])
R123 =
struct with fields:
R1: [6×1 sym]
R2: [6×1 sym]
R3: [6×1 sym]
R123.R1
ans =
***(lengthy symbolic crap, involving calls to rootof, so I am not showing it here) ***
As you see, MATLAB cannot solve the problem, because it is eqivalent to solving a 6th degree polynomial equation, with general coefficients. We know that to be unsolvable since the times of Abel-Ruffini.
If we set the values of C1, C2, C3, to be any numbers, then we can find solutions.
vpa(subs(R123.R1,[C1, C2, C3],[1 2 3]))
ans =
0.3316004237603664602689770159054 - 0.48968928642149717589266980263974i
0.3316004237603664602689770159054 + 0.48968928642149717589266980263974i
-0.67727571082108932181365367776708
- 0.44545496553550952707026021441356 - 0.3736322321293556146757255743177i
- 0.44545496553550952707026021441356 + 0.3736322321293556146757255743177i
1.0041527943713754554162200747834
vpa(subs(R123.R2,[C1, C2, C3],[1 2 3]))
ans =
- 0.079845331250055433847244132307056 + 0.43155633804501187058826539850356i
- 0.079845331250055433847244132307056 - 0.43155633804501187058826539850356i
0.20956799173702439009045715632746
0.015440948938726560130578944933645 - 0.21001674375391901343813988516564i
0.015440948938726560130578944933645 + 0.21001674375391901343813988516564i
0.084520772885633357342873218419357
vpa(subs(R123.R3,[C1, C2, C3],[1 2 3]))
ans =
0.043353560187098740733450099355771 - 0.042732496961942602507353808062521i
0.043353560187098740733450099355771 + 0.042732496961942602507353808062521i
-0.11131831773682864588136655258715
- 0.089958221513383998331835712491365 - 0.092526347848464263470112871373533i
- 0.089958221513383998331835712491365 + 0.092526347848464263470112871373533i
0.18616319594495471663369333441389
Pick any values for C1, C2, C3, and all 6 numerical solutions will drop out.
But trying to use fsolve to solve the problem will find one solution, one that completely depends on your starting values. Pick a different start point, and you will get a different solution.

1 Comment

Thank you for your answer.
I see that i was wrong. ok not totaly wrong but not on the ideal way.

Sign in to comment.

This is the answer:
fun = @root2d;
x0 = [1;1;1;1;1;1]; % 6 guesses needed
x = lsqnonlin(fun,x0) % used in place of fsolve but the result was the same because it showed using Levenberg-Marquardt algorithm instead.
function F = root2d(x)
R4=9;
R5=1;
R1=x(1);
R2=x(2);
R3=x(3);
C1=x(4);
C2=x(5);
C3=x(6);
F(1) = (R1*(C2+C3) + R2*(C1+C2) + R3*C3*(1-1 / ( R5 / (R4+R5))))-0.24792;
F(2) = (R1*R2*(C1*C2 + C1*C3 +C2*C3)+R1*R3*C2*C3 +R2*R3*(C1+C2)*C3*(1-1 / ( R5 / (R4+R5)) ))-0.7807;
F(3) = (R1*C1*R2*C2*R3*C3)-0.0948;
F(4) = ((R1*C1*R2*C2*R3*C3)/ ( R5 / (R4+R5)) )-0.948;
end

1 Comment

What you don't realize is that your "solution" finds only one of infinitely many solutions.
You can pick any two of those vairables, and set them equal to essentially any value you wish. Then you will be able to solve for the other 4 variables.
So this is not in fact a solution.
Worse, as Walter points out, your equations are rank deficiient. So you really need to pick THREE of the unknowns to fix at chosen values.

Sign in to comment.

Categories

Find more on Mathematics in Help Center and File Exchange

Products

Release

R2018a

Community Treasure Hunt

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

Start Hunting!