Fsolve don't work good with trigonometric
Show older comments
Hello,
I have to resolve a system with 8 equations and 8 unknows and I'm using Fsolve to do it. The problem is that the results isn't the awaited (I have the numerical solution).
Can it maybe depend on the trigonometric function?
What's my wrong?
Thank you in advance.
sol =fsolve(@(x)funzmia2(x), 1:8);
XA1=sol(1);
YA1=sol(2);
XB1=sol(3);
YB1=sol(4);
T12=sol(5);
T13=sol(6);
T14=sol(7);
T15=sol(8);
function G=funzmia2(x)
XA1=x(1);
YA1=x(2);
XB1=x(3);
YB1=x(4);
T12=x(5);
T13=x(6);
T14=x(7);
T15=x(8);
XA0=2.1;
YA0=0.6;
XB0=1.5;
YB0=4.2;
x1=1;
y1=1;
x=[2,3,2,1.5];
y=[0.5,1.5,2,1.9];
G(1)=XA1*XA0+YA1*YA0-x(1)*XA0-y(1)*YA0-x1*XA1-y1*YA1+(x1^2+y1^2+x(1)^2+y(1)^2)/2+cos(T12)*(-XA1*XA0-YA1*YA0+x1*XA0+y1*YA0-x1*x(1)-y1*y(1)+x(1)*XA1+y(1)*YA1)+sin(T12)*(XA0*YA1-YA0*XA1-y1*XA0+x1*YA0+x(1)*y1-x1*y(1)+y(1)*XA1-x(1)*YA1);
G(2)=XA1*XA0+YA1*YA0-x(2)*XA0-y(2)*YA0-x1*XA1-y1*YA1+(x1^2+y1^2+x(2)^2+y(2)^2)/2+cos(T13)*(-XA1*XA0-YA1*YA0+x1*XA0+y1*YA0-x1*x(2)-y1*y(2)+x(2)*XA1+y(2)*YA1)+sin(T13)*(XA0*YA1-YA0*XA1-y1*XA0+x1*YA0+x(2)*y1-x1*y(2)+y(2)*XA1-x(2)*YA1);
G(3)=XA1*XA0+YA1*YA0-x(3)*XA0-y(3)*YA0-x1*XA1-y1*YA1+(x1^2+y1^2+x(3)^2+y(3)^2)/2+cos(T14)*(-XA1*XA0-YA1*YA0+x1*XA0+y1*YA0-x1*x(3)-y1*y(3)+x(3)*XA1+y(3)*YA1)+sin(T14)*(XA0*YA1-YA0*XA1-y1*XA0+x1*YA0+x(3)*y1-x1*y(3)+y(3)*XA1-x(3)*YA1);
G(4)=XA1*XA0+YA1*YA0-x(4)*XA0-y(4)*YA0-x1*XA1-y1*YA1+(x1^2+y1^2+x(4)^2+y(4)^2)/2+cos(T15)*(-XA1*XA0-YA1*YA0+x1*XA0+y1*YA0-x1*x(4)-y1*y(4)+x(4)*XA1+y(4)*YA1)+sin(T15)*(XA0*YA1-YA0*XA1-y1*XA0+x1*YA0+x(4)*y1-x1*y(4)+y(4)*XA1-x(4)*YA1);
G(5)=XB1*XB0+YB1*YB0-x(1)*XB0-y(1)*YB0-x1*XB1-y1*YB1+(x1^2+y1^2+x(1)^2+y(1)^2)/2+cos(T12)*(-XB1*XB0-YB1*YB0+x1*XB0+y1*YB0-x1*x(1)-y1*y(1)+x(1)*XB1+y(1)*YB1)+sin(T12)*(XB0*YB1-YB0*XB1-y1*XB0+x1*YB0+x(1)*y1-x1*y(1)+y(1)*XB1-x(1)*YB1);
G(6)=XB1*XB0+YB1*YB0-x(2)*XB0-y(2)*YB0-x1*XB1-y1*YB1+(x1^2+y1^2+x(2)^2+y(2)^2)/2+cos(T13)*(-XB1*XB0-YB1*YB0+x1*XB0+y1*YB0-x1*x(2)-y1*y(2)+x(2)*XB1+y(2)*YB1)+sin(T13)*(XB0*YB1-YB0*XB1-y1*XB0+x1*YB0+x(2)*y1-x1*y(2)+y(2)*XB1-x(2)*YB1);
G(7)=XB1*XB0+YB1*YB0-x(3)*XB0-y(3)*YB0-x1*XB1-y1*YB1+(x1^2+y1^2+x(3)^2+y(3)^2)/2+cos(T14)*(-XB1*XB0-YB1*YB0+x1*XB0+y1*YB0-x1*x(3)-y1*y(3)+x(3)*XB1+y(3)*YB1)+sin(T14)*(XB0*YB1-YB0*XB1-y1*XB0+x1*YB0+x(3)*y1-x1*y(3)+y(3)*XB1-x(3)*YB1);
G(8)=XB1*XB0+YB1*YB0-x(4)*XB0-y(4)*YB0-x1*XB1-y1*YB1+(x1^2+y1^2+x(4)^2+y(4)^2)/2+cos(T15)*(-XB1*XB0-YB1*YB0+x1*XB0+y1*YB0-x1*x(4)-y1*y(4)+x(4)*XB1+y(4)*YB1)+sin(T15)*(XB0*YB1-YB0*XB1-y1*XB0+x1*YB0+x(4)*y1-x1*y(4)+y(4)*XB1-x(4)*YB1);
end
8 Comments
Maybe unrelated to your question (or maybe not, if you made an error), can't you rewrite your G equations as matrix and vector operations?
You're certainly asking for trouble when you have both x1 and x(1) in the same equation. It's also not clear why you have both x(1) and XA1 which are exactly the same thing.
edit: Certainly, something doesn't look right at all:
G(1) = XA1*XA0 + .. - x(1)*XA0 - ..
Since XA1 == x(1), these two terms cancel out.
Steven Lord
on 22 Jan 2020
How sure are you that your system of equations has one and only one solution? Perhaps both the solution you've calculated using your own methods and the solution provided by fsolve are valid solutions.
"I'm thinking of two numbers. Their average is 3. What are the numbers?" Both (3, 3) and (0, 6) are two of the infinite number of solutions to that question. Neither is "more right" a solution to the question asked than the other.
John D'Errico
on 22 Jan 2020
Any such problem with trig functions inside it almost always has multiple solutions. From what i can see, I would even predict infinitely many solutions. That fsolve found ONE solution, but not the one you expected? Um, so what? No surprise at all.
Remember that any such solver will find a solution based on the starting values you povide. Give it crap for starting values, and you should expect a random solution, or perhaps nothing reasonable at all.
But worse, it looks like your code is itself a bit suspect. Virtually impossible to read code is also virtually impossible to debug. Creating such multiple variable names so close to each other makes your code impossible to read or write safely. Could you have made a typo? I'd set the odds here at a very high level.
Finally, we cannot possibly even know which of the above reasons is why you got a different result from what you expected, because we do not know what your real system of equations is, or how they were derived. And could there be other reasons why there is a problem? I can think of a couple, at least.
Federico MegaMan
on 22 Jan 2020
Edited: Federico MegaMan
on 22 Jan 2020
John D'Errico
on 22 Jan 2020
Edited: John D'Errico
on 22 Jan 2020
If you already know the specific solution you want to get (then why are you doing this exersize?) then you could try a start point that is near the solution. How near must it be? That is impossible to know in advance.
The example I tend to use is that of a blind man, set on the surface of the earth, and given the task of finding a point on the earth that satisfies some goal or set of goals. My blind individual is given only a cane to search the area around him. Today, I'll task him with finding a point on the surface of the earth with an elevation of 147 meters above sea level, as well as an air temperature of 27 degrees C. I'll give him an altimeter and a thermometer to assess those numbers. Hey, I was nice and gave him a target that happens to be above sea level. ;-) For his assignment tomorrow, he might need scuba gear.
Now while he may find the spot on earth that satisfies his goals, there are surely many such solutions. What are the odds he will find the lattitude and longitude you happen to like?
The point is, ANY such solver, applied to a given problem has what are called basins of attraction. Start the solver at point X, and you will arrive at point Y. Start the solver near X, and you will usually end up at solution Y, within some tolerance, though not exactly, as a solver has a tolerance and convergence criteria. But that basin of attraction need not be a very simple set. And in multiple dimensions, those basins might have very nasty looking shapes, that is, if you could easily visualize what something looks like in 8 dimensions. Basins of attraction need not be convex sets either, in fact, they probably won't be such.
Federico MegaMan
on 22 Jan 2020
Steven Lord
on 22 Jan 2020
So I have a lot of solutions (because sin and cos if I understood) and to make the system converge in one of the solution I have to set start condition near to that solutions. Is it right?
Not necessarily. Basins of attraction can be tricky sometimes. See for example the picture associated with the Basins of Attraction section on Wikipedia's Attractor page. You could converge to the root corresponding to the big yellow region to the right of the picture from a few points on the left edge of the picture. Or you could move just a little bit up from that small yellow region on the left size of the image and end up converging to the roots corresponding to either the blue or red regions.
John D'Errico
on 23 Jan 2020
As it turns out, trig functions seem to create infinitely many solutions much of the time, although that is not lways true. I can easily create a simple problem with a trig function in it that has 0,1,2,3, ... solutions. In fact, any finite number of solutions. Or infinitely many solutions. But the presense of trig functions tends to often create infinitely many solutions. As your variables enter here, I would predict infinitely many of them, but that is just a guess.
Most nonlinear problems tend to have multiple solutions. I can make some simple generic arguments as to why that is so, but perhaps we can accept that claim to be true. There will usually be more solutions as you go higher in the number of dimensions. And the more highly nonlinear your function is, the more solutions you should expect. Products, squares, cubes of variables? More solutions. For example, how many roots does a cubic polynomial have? (3, if you count the complex ones.) Again, the argument would be a simple intuitive one.
So with 8 dimensions and a fairly complicated function, I will confidently predict the existence of many solutions.
To find a speciic solution, it HELPS to start near the solution. As Steven points out, a given basin of attraction is often not a simple set, and two start points near each other can easily diverge to different solutions. (It is very easy to design a function that does all sorts of wierd things.) But it does help to start near the "desired" solution.
How can you find ALL solutions? Since there may be infinitely many solutions, you cannot do so, because infinity is a long way away. If there are finitely many solutions, then you can try to use multi-start/random start methods to find them all, clustering the results, since many start points will converge to essentially the same solution. Is this necessarily trivial? Not always. In 8 dimensions, with a fairly nonlinear function, lets say we predict there may be dozens of solutions to your problem. But how do you know when to stop looking? An 8 dimensional space is a big place to search, a relatively huge one, in fact. Could there be some solution that is difficult to find hidden away, in a spot with a tiny basin of attraction? Yes, that can happen. Not all basins of attraction have the same volume. So for a tiny one, the probability of landing a random point in the necessary region by a random multi-start method can be small.
In fact, it is trivial to write a one variable problem with some solutions that can essentially never be found, without using billions or trillions of start points. Thus, find all roots of the function f(x) == 0...
f(x) = x + delta(x - pi) - 10
where delta(x) is a differentiable function that approaches a spike of infinitely small width, but is essentially zero everywhere else. We know that one root lies at essentially x==10. There will be two more roots that lie very near x==pi. But the basin of attraction of those roots can be made infinitesimally small, if the width of the delta function is made as small as we desire.
So you may need to have many millions of start points in some cases to be confident. And since it is highly probable that you have infinitely many solutions, when do you stop searching?
At best, a simple scheme can search until no more new, distinct solutions have been found recently. (Remember that clustering is highly important here, since multiple solutions will terminate in a ball around a given true solution.) Given some sample size, you can then declarer that if another unfound solution does exist, the associated basin of attraction must have a volume no larger than some value. So using a random multi-start method, you can assign some probability that you have found "all" solutions, at least all with a reasonably large basin of attraction. The problem is that in higher dimensions, volume is a nasty thing.
For example, what is the "volume" of an n-dimensional sphere, of radius R? Not difficult to compute, but easier to look up online.
We see that if I define V(n,r) as the volume of a sphere of radius r in n dimensions...
Vnr = @(n,r) pi.^(n/2).*r.^n./gamma(n/2+1);
What does the volume of an n-sphere of radius 10 grow to, as the dimension varies from 1 to 8?
format short g
Vnr(1:8,10)
ans =
20 314.16 4188.8 49348 5.2638e+05 5.1677e+06 4.7248e+07 4.0587e+08
That radius 10 sphere has volume of 408 million in 8 dimensions. So a sample size of 20 in one dimension grows by a factor of over 20 million in 8 dimensions to get a similar coverage density.
Answers (2)
Are Mjaavatten
on 22 Jan 2020
Edited: Are Mjaavatten
on 22 Jan 2020
Your function has several different zeros. Which one fsolve finds will depend on the starting point. I ran:
f = 100; while norm(f)>1e-5;x0 = randn(1,8);x = fsolve(@funzmia2,x0);f = funzmia2(x); end;x
a few times and came up with these solutions:
x =
0.6074 -1.1271 -0.5864 0.9970 -0.0239 0.7690 1.5855 1.9381
x =
0.8133 -1.3517 3.0430 -0.0529 3.8244 0.5740 -1.1023 -0.7352
x =
1.3195 0.4235 -4.7913 10.3315 -1.2170 -0.7230 -0.1282 -0.2885
x =
1.4074 0.3822 -18.0967 27.4654 0.3974 -0.8546 -0.2216 -0.3651
To find the solution you seek, say xstar, you should set x0 to be not too different from xstar.
2 Comments
Federico MegaMan
on 22 Jan 2020
Are Mjaavatten
on 23 Jan 2020
Edited: Are Mjaavatten
on 23 Jan 2020
The simplest way to find an x0 that gives your solution is probably to run the code in my previous comment until you get the solution you seek. Then you know that starting with the current x0 will converge to the sought soltion.
By the way: What makes this solution "better" than the others? If there are bounds on your variables (e.g. all elements of x must be positive) you should try another approach. Take a look at this page. Alternatively, you might try my broyden function. This is less robust than fsolve, but the formulation of bounds is quite straight-forward.
There are some solutions like below
No. 1 2 3 4 5
xa1 0.835289443057692 1.97769580537186 0.119396464246135 0.813305799520437 0.813305799523252
ya1 -0.911952025069297 2.56204412078944 -4.10419747212045 -1.3516952883515 -1.35169528829444
xb1 3.16956094184193 2.52727147266688 -0.478993427259013 3.04298779138584 3.04298779149674
yb1 -0.192974988365331 0.495158145943572 1.05384368309623 -0.0529051982349412 -0.0529051983643883
t12 0.52783376905384 3.44925679190791 -15.32615640401 3.82442761233437 -2.45875769478231
t13 0.576993557107166 -8.32808879128648 0.773504081931409 6.85721216626806 0.574026859090344
t14 -1.07931492658616 -26.3674349703953 1.62294371082123 -1.10225944072511 -1.10225944071642
t15 -0.709634319590394 -0.883474122659977 -16.8672147232274 -7.01835799147342 -7.01835799146812
Categories
Find more on Programming in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!