My diff function won't work and I'm not sure why

48 ビュー (過去 30 日間)
Sarah Johnson
Sarah Johnson 2020 年 2 月 12 日
編集済み: Dimitris Kalogiros 2020 年 2 月 13 日
My goal is to give an initial x, and return the function values at that x
function [f, g, h] = myfunction(x)
syms x
q = exp(2*sin(x)) - x;
f = q(x);
dq = diff(q);
g = dq(x);
dq2 = diff(dq);
h = dq2(x);
end
So what I've been struggling with is that if I assign my equation as above, then I can find "f = q(x)" but there is an error for the "diff". If I change the syntax to
q = @(x) exp(2*sin(x)) - x;
then I'm able to calculate using "diff" but then the "f = q(x)" doesn't work. I'm pretty new to MATLAB and not great at it so any advice would be great!
Update: This is the error message I am recieving for the first code
Error using sym/subsindex (line 855)
Invalid indexing or function definition. Indexing must follow MATLAB indexing. Function arguments must be symbolic variables, and function body must be sym expression.
Error in sym/subsref (line 900)
R_tilde = builtin('subsref',L_tilde,Idx);
Error in myfunction (line 4)
f = q(x);
And for the other code it is:
Undefined function 'diff' for input arguments of type 'function_handle'.
Error in myfunction2 (line 4)
dq = diff(q);
  1 件のコメント
Steven Lord
Steven Lord 2020 年 2 月 12 日
What is the full and exact text of the error messages you receive in each of the circumstances? Please show us all the text displayed in red and/or orange in the Command Window when you try to run this code.

サインインしてコメントする。

回答 (3 件)

Dimitris Kalogiros
Dimitris Kalogiros 2020 年 2 月 12 日
Try this :
clearvars; close all; clc;
syms x
q(x) = exp(2*sin(x)) - x;
f(x) = q(x)
dq(x) = diff(q(x));
g(x) = dq(x)
dq2(x) = diff(dq(x));
h(x) = dq2(x)
or this one:
clearvars; close all; clc;
syms x
q(x) = exp(2*sin(x)) - x;
f = q(x)
dq(x) = diff(q(x));
g = dq(x)
dq2(x) = diff(dq(x));
h = dq2(x)
  1 件のコメント
Sarah Johnson
Sarah Johnson 2020 年 2 月 12 日
Both of these still are only producing the functions themselves and not the value. I'm not sure what's wrong.
Screen Shot 2020-02-12 at 5.18.20 PM.png

サインインしてコメントする。


David Goodmanson
David Goodmanson 2020 年 2 月 12 日
編集済み: David Goodmanson 2020 年 2 月 12 日
Hi Julia,
if you want to use this for a variety of functions, then
fun = @(x) exp(2*sin(x)) - x; % one example
[f g h] = newfuns(fun)
function [a b c] = newfuns(fun)
syms x
a = fun(x);
b = diff(a);
c = diff(b);
end
f =
exp(2*sin(x)) - x
g =
2*exp(2*sin(x))*cos(x) - 1
h =
4*exp(2*sin(x))*cos(x)^2 - 2*exp(2*sin(x))*sin(x)
  1 件のコメント
Sarah Johnson
Sarah Johnson 2020 年 2 月 12 日
My goal is to find the function values at the initally given x. Not find the differentials themselves. I have done that but I'm having trouble plugging in the inital x to give me an answer. For example, if I plug in x = 0 and then call "myfunction(x)", I would want my f to be 1

サインインしてコメントする。


Dimitris Kalogiros
Dimitris Kalogiros 2020 年 2 月 13 日
編集済み: Dimitris Kalogiros 2020 年 2 月 13 日
I think , the answer to your problem is the following piece of code:
clearvars; clc; close all;
% call of the function
myVal=5;
[f, g, h] = myfunction(myVal);
fprintf('f = %d g = %d h = %d', f, g, h);
% definition of the function
function [f, g, h] = myfunction(y)
syms x
q = exp(2*sin(x)) - x;
f = double( vpa( subs( q, y) ) );
dq = diff(q);
g = double( vpa(subs( dq , y)) );
dq2 = diff(dq);
h = double( vpa(subs( dq2, y)) );
end
A much more usuful version , is the following. Where you can pass your mathematical function as an argument:
clearvars; clc; close all;
% define your mathematical function
syms x
myF=exp(2*sin(x)) - x;
% define the evaluation point
myVal=5;
% call your function calculator
[f, g, h] = myFunctionCalculator(myVal, myF, x);
% print results
fprintf('f = %d g = %d h = %d', f, g, h);
function [f, g, h] = myFunctionCalculator(xo, q, x)
f = double( vpa( subs( q, x, xo) ) );
dq = diff(q);
g = double( vpa(subs( dq , x, xo)) );
dq2 = diff(dq);
h = double( vpa(subs( dq2, x, xo)) );
end
.

カテゴリ

Help Center および File ExchangeCalculus についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by