- doc subs
- doc subexpr

# how to evaluate a symbolic function in matlab

68 views (last 30 days)

Show older comments

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.

##### 0 Comments

### Answers (4)

Youssef Khmou
on 11 Feb 2013

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 Comments

Youssef Khmou
on 12 Feb 2013

Edited: Youssef Khmou
on 12 Feb 2013

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
on 12 Feb 2013

Edited: Brian B
on 12 Feb 2013

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
on 12 Feb 2013

Edited: Youssef Khmou
on 12 Feb 2013

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

##### 0 Comments

Brian B
on 12 Feb 2013

syms x

func=cos((pi*x)^4);

RHS=diff(func,x,2);

xx=-1:0.1:1;

d2f = subs(RHS, xx)

##### 2 Comments

vikas singh
on 12 Mar 2023

### See Also

### Categories

### Community Treasure Hunt

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

Start Hunting!