matlabFunction(): output is not the same as symbolic function
Show older comments
Hello everybody,
I still am new to matlab, so chances are that I am doing something completely wrong, but I am unable to figure it out. Any sort of feedback is appreciated at this point.
The problem I am encountering is as follows: I have a symbolic function (least squares), which I need to differentiate 17 times with respect to different variables or variable combinations. These are used for the non linear least squares gauss-newton algorithm I am trying to implement. To do this I use the symbolic toolbox and the diff function. So far everything works out. Then I feed the symbolic functions with data and do some calculations (using double(subs(symbolicFunctionHere)). I get the desired results, but it takes ages to complete.
Well then, I though, convert the differentiated symbolic functions to matlab functions using matlabFunction(). That also seems to be working. But when I use the matlab functions instead of the symbolic functions for the calculations the results of the calculations are nowhere comparable. All I seem to get in the end is NaN.
I am fully aware that matlab offers ready to use non-linear least squares solutions, but I am trying to lear the background and am trying to implement a data fitting myself. To see if the math I am trying to implement is correct, I am trying it out in matlab before implementing it.
In case my vocabulary was wrong at one or the other point, below you can see what I am trying to do:
syms y(x) A x x0 p1 p2 out;
y(x) = A * (exp(-(x-x0)/p1) - exp(-(x-x0)/p2));
err = simplify(expand((out - y(x))^2));
f1=collect(simplify(expand(diff(err,A))));
% f1=matlabFunction(collect(simplify(expand(diff(err,A))))); % used alternatively, yields f1(p1,p2,A,x,x0,out)
. all differentials
. are defined
. like the above here
. also initial guess of fitting variables A,x0,p1,p2
for m = 1:20 % do 20 iterations
f1sum = 0;
. all sums
. are nulled
. in this section
for n = 1:length(data) % data is a normalized data vector
out = data(n);
x = xvals(n); % xvals is a normalized x value vector
f1sum = f1sum + double(subs(f1));
% f1sum = f1sum + f1(p1,p2,A,x,x0,out); used alternatively, yields strange results
.
. done for all functions
.
end
% calculate new fitting variables
end
Any input is appreciated, thanks in advance!
Best regards,
Daniel
2 Comments
Torsten
on 23 Oct 2017
You mean
f1=matlabFunction(collect(simplify(expand(diff(err,A)))));
instead of
f1=matlabFunction(collect(simplify(expand(diff(err,U)))));
?
Best wishes
Torsten.
Birdman
on 23 Oct 2017
err = simplify(expand((y - y(x))^2));
In this line, are you sure that you substract y from y?
Answers (2)
daniel
on 23 Oct 2017
Categories
Find more on Functional Programming in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!