How to find the roots of a trigonometric equation?
12 次查看(过去 30 天)
显示 更早的评论
Hi, I want to determine the roots of a trigonometric equation :
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/858170/image.png)
I try with 3 methods:
by Method 1, I got logarithmic answer. In Method 2, I got only one answer while I need more (I expended the length of the domain but nothing happend). and by Method 3 which Star Strider helped me alot, when I check the calculation and substitute the roots in equation I got nonzero answer (in that problem I did not have this error). I really appreciate any help.
L=1e-3;
f=-35;
e=sqrt(2/L-f^2);
pp=20;
l1=fplot(@(gammaL)e*sin(gammaL),[-pp,pp],'c');
hold on
l2=fplot(@(gammaL)-f*cos(gammaL));
figure
l3=fplot(@(gammaL)(e*sin(gammaL)+f*cos(gammaL)),[-pp,pp]);
zxi = find(diff(sign(l3.YData)));
for k = 1:numel(zxi)
idxrng = (-1:1)+zxi(k); % Index Range For Interpolation
if idxrng~=0
gammaL(k,:) = interp1(l3.YData(idxrng), l3.XData(idxrng), 0);
end
end
Thanks in advance
2 个评论
David Goodmanson
2022-1-10
编辑:David Goodmanson
2022-1-10
Hi raha,
is this the correct equation? The solution is simply gammaL= atan( -theta_c /e ) + n*pi, where n is any integer.
采纳的回答
John D'Errico
2022-1-10
编辑:John D'Errico
2022-1-10
Solving for the roots of the trigonometric equation you show in youer question is actually trivial. Sorry, but it is. In fact, it can be done with pencil and paper, if you use a simple identity from trig.
You claim to have the problem:
e*sin(gammaL) + thetaC*cos(gammaL) == 0
where e and thetaC are known. Jut rewrite it as
-thetaC/e = sin(gammaL)/cos(gammaL)
Now if you recognize the right hand side as the tangent, we have
tan(gammaL) = -thetac/e
and therefore, the principle solution is just
gammaL = atan(-thetac/e)
if you want to solve for ALL solutions, remember that the tangent function is periodic, with period pi. so the fully general solution should be just
gammaL = atan(-thetac/e) + k*pi
where k is any integer. This should be valid as long as thetaC is not zero, and as long as cos(gammaL) is not zero. And as long as I am awake when I write this. :)
See what syms says now..
syms e thetaC gammaL
sol = solve(e*sin(gammaL) + thetaC*cos(gammaL) == 0,gammaL,'returnconditions',true)
sol.gammaL
sol.conditions
So, is this a valid solution? Is it mathematically equivalent to my solution? Actually, yes. It must be so. That the symbolic toolbox did not see the simplification I found is not that important. You asked for a solution, did you not?
The symbolic toolbox saw that we can transform the problem using the identity
sin(u+v) = sin(u)cos(v) + cos(u)sin(v)
then it used deMoivre's identiy
exp(i*theta) = cos(theta) + i*sin(theta)
to solve for gammaL.
Both solutions should be equally valid, just expressed differently. For example:
e = 1; thetaC = 2;
vpa(subs(sol.gammaL),5)
syms K
vpa(atan(-thetaC/e)) + K*pi
Both solutions will come out of there, depending on if K is even or odd. With some mental effort, I could surely prove they were mathematically equivalent, but is there a good reason to do so?
3 个评论
John D'Errico
2022-1-10
We do not know exactly how solve achieves its magic. MathWorks does not distribute their code for a tool like that, and it can easily change in some future release. And the exact flowchart for how solve works will be quite complicated I am very sure.
But typically, a tool like solve tries different approaches, much like I might. I might look to see if I can get the problem into a simple form that I know how to solve. So I'll try a few things, then when one works, I am happy. Solve does the same sort of thing, except that solve is never truly going to be happy. (Computer programs lead such boring lives.)
As I said, it appears that solve apparently tried using a double angle identity, then it saw that deMoivre applies, so a solution can drop out by use of a natural log. In my personal solution, I followed a different path.
Is one analytical solution better than the other? Not really, although one must be care with a solution that produces complex results with an effectively zero imaginary part. Now you want to look to see how large is the imaginary part.
Is one solution method more accurate? I'm not sure what that means. If both approaches yield a valid solution, then they are both correct. One must always be careful of course with analytical solutions as I used. If you will divide by cos(thetaC), then you need to know that cos(thetaC) will never be zero, else you have now caused a problem due to the singularity.
If you used a numerical solver to find a solution, but in another approach, an analytical solution is found, then the numerical solver is never any better than the convergence tolerances applied. So one would generally prefer the analytical solution. If you are comparing two numerical methods, both of whch find subtly different solutions, asking which is more correct will depend on the tolerances for each method employed. It will depend on the methods used. You can compare the solutions found. How accurately do the various solutions found yield solutions to the original problems? Substitute the results into your equations. Do you get zero out? If not, then how far off from zero do you get? Which one is closer to zero?
Really, this is almost coming down to wanting to summarize a complete course on numerical analysis and numerical methods in not much more than one paragraph. (ok, one comment.) I can't do that.
In the end, you may be best off sitting down with a mathematician who understands numerical methods, and has a few minutes to help you. Show them your problem, not necessarily the ocde you used to try to solve it, as that only confuses things, since I think you are also a little confused here. Explain what you need to do. (Don't send me mail, as I won't do e-mail consulting.)
更多回答(1 个)
VIGNESH B S
2022-1-10
syms e x t_c
eqn = e.*cos(x) + t_c.*cos(x) == 0;
solve(eqn,x)
here gamma*L = x
t_c - theta c
solve(equation , varaiable) and variable here is x = gamma*L.
另请参阅
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!