Efficient way to solve an equation in MATLAB
10 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Ali Almakhmari
am 25 Sep. 2022
Kommentiert: Dyuman Joshi
am 26 Sep. 2022
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
0 Kommentare
Akzeptierte Antwort
Steven Lord
am 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
sol = fzero(h, 1)
Check the solution
h(sol) % Should be close to 0
Or check explicitly, if the way f creates a function handle looks like "magic".
2*sol + sin(2*sol) - pi*sin(1)
If you're going to solve this repeatedly for potentially the same value of x, you may also want to memoize h.
3 Kommentare
Steven Lord
am 25 Sep. 2022
That works if x has been defined before you create the function handle, but note that changing the value of x after the function handle has been created does not change the function handle.
x = 1;
f = @(y) x+y;
f(2) % 3
x = 999;
f(2) % still 3 not 1002
Dyuman Joshi
am 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
sol = fzero(h, 1)
F = @(x,theta) 2*theta + sin(2*theta) - (pi*sin(x));
fzero(@(theta) F(1,theta),1)
Weitere Antworten (0)
Siehe auch
Kategorien
Mehr zu Get Started with MATLAB finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!