Solve cannot find solutions where plotting shows they exist
2 次查看(过去 30 天)
显示 更早的评论
I am trying to find points in a function, after fitting to some data, where the slope is zero. The obvious (to me) way to do this is to take the derivative of the equation and find the zero-crossings. The equation I am fitting is a difference of Gaussians (with shared mean but different standard deviations) on a linear slope. I am using a mixture of standard and symbolic functions because I am not sure how to do everything using one or the other. Basically, I
- Define my function using a function handle and using symbolic math
- Pull some reasonable initial parameters from the data
- Optimize the fit of the function
- Compute the derivative of the optimized function
- Solve the derivative for y = 0.
The following code looks, from the graph produced, like it should have four solutions for this particular data-set, but I get none.
load yData.mat
% MATLAB Function
DoGoLS = @(Params, xData) ...
Params(1) + ...
Params(2) * exp(-.5 * ((xData - Params(3))/Params(4)).^2) - ...
Params(5) * exp(-.5 * ((xData - Params(3))/Params(6)).^2) + ...
Params(7) * xData
% Symbolic Function
syms y0 a1 x0 b1 a2 b2 c x
SymDoGoLS(y0, a1, x0, b1, a2, b2, c, x) = ...
y0 + ...
a1 * exp(-.5*((x - x0)/b1)^2) - ...
a2 * exp(-.5*((x - x0)/b2)^2) + ...
c * x
% Initial parameters
DoGoLSInit = ...
[median(yData), ... %y0
max(yData) - min(yData), ... %a1
size(yData, 1) / 2, ... %x0
35, ... %b1
max(yData) - min(yData), ... %a2
350, ... %b2
0]; %c
% Optimal parameters
DoGoLSFit = lsqcurvefit(...
DoGoLS, ... % handle
DoGoLSInit, ... % initial params
(1:size(yData, 1))', ... % xData
yData); % yData
% Compute and plot derivative of solved function
SymDoGoLSdYdX(x) = diff(SymDoGoLS(...
DoGoLSFit(1), ...
DoGoLSFit(2), ...
DoGoLSFit(3), ...
DoGoLSFit(4), ...
DoGoLSFit(5), ...
DoGoLSFit(6), ...
DoGoLSFit(7), x), x);
subplot(2, 1, 1)
plot((1:size(yData, 1)), yData, 'b', ...
(-750:1750), DoGoLS(DoGoLSFit, (-750:1750)), '--r')
axis auto; title('Data and Fit')
subplot(2, 1, 2)
ezplot('0', [-750, 1750]);
hold on
ezplot(matlabFunction(SymDoGoLSdYdX), [-750, 1750]);
axis auto; title('Fit dY/dX')
% Find zero-crossings
ZCs = solve(SymDoGoLSdYdX(x) == 0, x)
Can someone explain what I am doing wrong? Or is there some better way to obtain the solution? I've attached the data
0 个评论
采纳的回答
John D'Errico
2016-7-7
No. Solve could not find an ANALYTICAL solution. The expression you have has no such solution. That a numerical solver could not find a solution is not true.
ZCs = solve(SymDoGoLSdYdX(x) == 0, x)
Warning: Cannot find explicit solution.
> In solve (line 316)
ZCs =
Empty sym: 0-by-1
ZCs = vpasolve(SymDoGoLSdYdX(x) == 0, x,500)
ZCs =
522.06599522322937335889187954597
更多回答(0 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Calculus 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!