how to evaluate a symbolic function in matlab

Hi,
I am trying to automate my code to get the derivative of a function an evaluate that in given points. For example,
syms x
func=cos((pi*x)^4);
RHS=diff(func,x,2);
% RHS will be ==> - 16*pi^8*x^6*cos(pi^4*x^4) - 12*pi^4*x^2*sin(pi^4*x^4)
x=[ -1
-0.978147600733806
-0.913545457642601
-0.809016994374947
-0.669130606358858
-0.5
-0.309016994374947
-0.104528463267653
0.104528463267653
0.309016994374947
0.5
0.669130606358858
0.809016994374947
0.913545457642601
0.978147600733806
1]
and I want RHS and Func in those z values as a vector.
I appreciate the help. Thank you.

답변 (4개)

ChristianW
ChristianW 2013년 2월 11일

1 개 추천

  • doc subs
  • doc subexpr
Youssef  Khmou
Youssef Khmou 2013년 2월 11일

0 개 추천

hi, you can use function_handle :
func=@(x) cos((pi*x).^4)
x=0:100; % example of vector x .
RHS=diff(func(x),2);

댓글 수: 8

There is something not working there. Size of x is 101 and size of RHS is 99. And values are not right.
func=@(x) x.^3; x=0:10; RHS=diff(func(x),2)
RHS =
6 12 18 24 30 36 42 48 54
Youssef  Khmou
Youssef Khmou 2013년 2월 12일
편집: Youssef Khmou 2013년 2월 12일
Kamuran, that is normal routine for "diff" function , if you differentiate func with length p : diff(func,n) n times then the returned vector has p-n points .
if you put :
RHS4=diff(func(x),4);
Length of RHS4 is 101-4 .
diff produces a shift, you can truncate the 1st element of the RHS(1)=[];
Brian B
Brian B 2013년 2월 12일
diff operates differently on symbolic objects than on numeric vectors. You want (and have, as shown in your question) an analytical expression for the second derivative. You just have to substitute the numerical values of x at which you want the solution. Did you look at the functions suggested above by ChristianW?
The values are right Kamuran :
x=0:100;
func=@(x) x.^3;
f=x.^3;
df2=6.*x;
RHS=diff(func(x),2);
figure, plot(df2), hold on, plot(RHS,'r')
legend(' numerical d²f',' diff(function_handle,2)')
Brian B
Brian B 2013년 2월 12일
편집: Brian B 2013년 2월 12일
You've computed an approximation assuming that the function will be evaluated at an increasing sequence of points close together. It does not work for the x-vector given in the original question.
Youssef  Khmou
Youssef Khmou 2013년 2월 12일
편집: Youssef Khmou 2013년 2월 12일
Brian : of course with linear x , what is your solution then? can you write a Diff function that gives the approximate der whatever the x is .
Youssef  Khmou
Youssef Khmou 2013년 2월 12일
편집: Youssef Khmou 2013년 2월 12일
Well in this case you have to add diff(x) as DENOMINATOR :
Given your x :
func=@(x) x.^3;
f=x.^3;
df2=6.*x;
df2(1)=[];
d1=diff(func(x))./diff(x);
RHS=diff(d1)./diff(x(1:end-1));
figure, plot(df2), hold on, plot(RHS,'r')
legend(' numerical d²f',' diff(function_handle,2)')
you have to increase the Sample Rate in x to get better approximation .
Brian B
Brian B 2013년 2월 12일
편집: Brian B 2013년 2월 12일
Hi Youssef,
I'm not saying your solution is not valid. I was simply pointing out that the original question refers to symbolic calculation of an exact derivative. It is possible to evaluate the symbolic expression at any arbitrary set of points, without regard to interval size or ordering. That is what the subs command does, to which ChristianW referred. See my answer below.
regards,
Brian

댓글을 달려면 로그인하십시오.

Youssef  Khmou
Youssef Khmou 2013년 2월 12일
편집: Youssef Khmou 2013년 2월 12일

0 개 추천

Kamuran, to get better approximation you need to increase the sample rate in x and interpolate :
x=[ -1
-0.978147600733806
-0.913545457642601
-0.809016994374947
-0.669130606358858
-0.5
-0.309016994374947
-0.104528463267653
0.104528463267653
0.309016994374947
0.5
0.669130606358858
0.809016994374947
0.913545457642601
0.978147600733806
1];
x=x';
x=interp(x,5); % Example
func=@(x) x.^3;
f=x.^3;
df2=6.*x;
df2(1)=[];
d1=diff(func(x))./diff(x);
RHS=diff(d1)./diff(x(1:end-1));
figure, plot(df2), hold on, plot(RHS,'r')
legend(' numerical d²f',' diff(function_handle,2)')
Compare this result with the one given in the Comment with original x, there is an enhancement .
I hope that helps
Brian B
Brian B 2013년 2월 12일

0 개 추천

syms x
func=cos((pi*x)^4);
RHS=diff(func,x,2);
xx=-1:0.1:1;
d2f = subs(RHS, xx)

댓글 수: 2

right , that works better with "subs" function .
if I have function of two variable suppose x and t and I have to evaluate it on x=0:100:10000 and t= 0,1,5,10 15. how to do. suppose the fucnction is F(x,t)=sin(x)*exp(t)

댓글을 달려면 로그인하십시오.

카테고리

태그

질문:

2013년 2월 11일

댓글:

2023년 3월 12일

Community Treasure Hunt

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

Start Hunting!

Translated by