优雅的方式来创建一个函数的符号导数,直到N阶

时间:2018-03-26 18:00:18

标签: java matlab

到目前为止,我如何从f(x)创建等级n的导数:

f = exp(-(x/2)),f1 = diff (f), f2 = diff (f1), f3 = diff(f2), f4 = diff(f3), f5 = diff(f4)

此命令可以执行以下操作:

  • 为每个衍生产品创建一个变量
  • 使用上一个派生词进行下一个派生

此命令无法执行的操作:

  • 输入一个整数(n)以确定应创建多少衍生物
  • 自动为之前的差异化创建差异

如何添加我需要的功能,让我更轻松? 有没有办法更优雅地做到这一点?

脚本的语法应该与此java片段等效:

int n;
String function;

//User input function
//User input diff level n
System.out.print("f(x)= " + function);

for(i = 1; i < n; i++){
function = diff(function);
system.out.print("f"+ i + "(x): " + function);
}

我在matlab中尝试过这个,但我不知道我在做什么:

syms x
int n = 0;
string f;

n = str2double(input('Enter an integer: ','s'));
if isnan(n) || fix(n) ~= n
  disp('Please enter an integer')
end

disp('f(x) = ', f);

f = str2function(input('Enter a function(String): ','s'));
if isnan(f) || fix(f) ~= f
  disp('Please enter a String')
end

while n > 1
    n = n-1;
    f = diff(f);
    disp('f',n,'(x)=', f)
end

1 个答案:

答案 0 :(得分:2)

for循环可用于填充包含不同衍生物的向量。

syms x

f = exp(-(x/2));                     % function
n = 5;                               % number of derivatives

derivatives = sym('A', [1 n]);       % allocate memory

for ii=1:n
    derivatives(ii) = diff(f,ii);
end

在matlab中你不能定义类型,所以只需

n = 0;

没有int。您正确获取输入,但只询问一次。当给出不正确的输入时,程序继续并且用户不能输入新的输入。我使用while循环来继续询问输入,直到它是正确的:

n = str2double(input('Enter an integer: ','s'));
while isnan(n) || fix(n) ~= n
  disp('Please enter an integer')
  n = str2double(input('Enter an integer: ','s'));
end

对于f,我想sym,而不是函数。 disp无法用于符号变量,但fprintf可以:

fprintf('f(x) = %s\n', char(f));

然后我会使用for循环而不是一段时间,因为你事先知道会有多少次迭代。

总代码:

syms x

n = str2double(input('Enter an integer: ','s'));
while isnan(n) || fix(n) ~= n
  disp('Please enter an integer')
  n = str2double(input('Enter an integer: ','s'));
end


f = sym(input('Enter a function(String): ','s'));

fprintf('f(x) = %s\n', char(f));

derivatives = sym('A', [1 n]);
for ii=1:n
    derivatives(ii) = diff(f,ii);
    fprintf('f^{(%i)}(x) = %s\n', ii, char(derivatives(ii)));
end

我尝试使用上标来获取衍生品,但我似乎无法管理......如果我发现,我会更新答案。