Efficient way to solve an equation in MATLAB

4 views (last 30 days)
I have a nested for loop system that will run 251658240...you heard me correctly. There isn't much in this for loop that is time-consuming, except solving this equation: where "x" is a costant that changes with each iteration. The method I am using right now is
syms theta
theta = vpasolve((2*theta + sin(2*theta))==(pi*sin(x)));
Is there a way to make this solving process faster? Cause its soooo time-consuming doing it this way

Accepted Answer

Steven Lord
Steven Lord on 25 Sep 2022
Solve numerically using fzero. Here I've written a function handle that itself makes function handles. I can pass that generated function handle into fzero to get a solution.
f = @(x) @(theta) 2*theta + sin(2*theta) - (pi*sin(x));
h = f(1) % h "remembers" that x is 1
h = function_handle with value:
@(theta)2*theta+sin(2*theta)-(pi*sin(x))
sol = fzero(h, 1)
sol = 0.8232
Check the solution
h(sol) % Should be close to 0
ans = 0
Or check explicitly, if the way f creates a function handle looks like "magic".
2*sol + sin(2*sol) - pi*sin(1)
ans = 0
If you're going to solve this repeatedly for potentially the same value of x, you may also want to memoize h.
  3 Comments
Dyuman Joshi
Dyuman Joshi on 26 Sep 2022
Yes, I am aware of that. However, what would be the difference between -
f = @(x) @(theta) 2*theta + sin(2*theta) - (pi*sin(x));
h = f(1) % h "remembers" that x is 1
h = function_handle with value:
@(theta)2*theta+sin(2*theta)-(pi*sin(x))
sol = fzero(h, 1)
sol = 0.8232
F = @(x,theta) 2*theta + sin(2*theta) - (pi*sin(x));
fzero(@(theta) F(1,theta),1)
ans = 0.8232

Sign in to comment.

More Answers (0)

Categories

Find more on Function Creation in Help Center and File Exchange

Products


Release

R2020b

Community Treasure Hunt

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

Start Hunting!

Translated by