1

我有一个看起来像这样的符号函数

syms x y(x) h
fn(x) = y + (h^2*(diff(y(x), x) + 2))/2 + (h^5*diff(y(x), x, x, x, x))/120 + (h^3*diff(y(x), x, x))/6 + (h^4*diff(y(x), x, x, x))/24 + h*(2*x + y(x) - 1)

我想用它的一阶导数替换 y 的所有导数实例,即

subs(fn, sym('diff(y(x), x)'), dy)

其中dy已经定义为

dy(x) = 2*x + y(x) - 1

结果如下:

ans(x) =

y + (h^2*(2*x + y(x) + 1))/2 + (h^5*diff(y(x), x, x, x, x))/120 + (h^3*diff(y(x), x, x))/6 + (h^4*diff(y(x), x, x, x))/24 + h*(2*x + y(x) - 1)

它代替一阶导数,但不代替高级导数。我想要的是这个h^5词有(h^5*diff(dy(x), x, x, x)。有没有办法做到这一点?

我目前的方法非常老套,涉及将 sym 转换为字符串,用 替换一阶导数dy,然后转换回 sym 并评估以将系列中每个项的顺序减少一个,但它必须是递归的,因为在每个的阶段衍生物dy然后被包含的东西替换diff(y, ...)。我希望有一种更清洁的方法来处理这个问题。

4

1 回答 1

1

您需要记住,Matlab 将事物视为diff(y,x)diff(y,x,2)作为不同的变量。它不知道如何替换diff(y,x)into diff(y,x,2),因为对于抽象函数(没有明确定义的函数,例如y(x))的这种通用操作是不明确的。

像这样从最高阶导数开始从另一端执行替换的东西怎么样:

syms y(x) h
dy(x) = 2*x + y - 1
fn(x) = y + (h^2*(diff(y, x) + 2))/2 + (h^5*diff(y, x, 4))/120 + (h^3*diff(y, x, 2))/6 + (h^4*diff(y, x, 3))/24 + h*(2*x + y - 1)
fn2 = subs(fn, diff(y, x, 4), diff(dy, x, 3));
fn2 = subs(fn2, diff(y, x, 3), diff(dy, x, 2));
fn2 = subs(fn2, diff(y, x, 2), diff(dy, x));
fn2 = subs(fn2, diff(y, x), dy);

这返回

fn2(x) =

y(x) + (h^2*(2*x + y(x) + 1))/2 + (h^3*(2*x + y(x) + 1))/6 + (h^4*(2*x + y(x) + 1))/24 + (h^5*(2*x + y(x) + 1))/120 + h*(2*x + y(x) - 1)

或者,您dy(x)最初可以将其保留为抽象符号表达式:

syms y(x) dy(x) h
fn(x) = y + (h^2*(diff(y, x) + 2))/2 + (h^5*diff(y, x, 4))/120 + (h^3*diff(y, x, 2))/6 + (h^4*diff(y, x, 3))/24 + h*(2*x + y - 1)
fn2 = subs(fn, diff(y, x, 4), diff(dy, x, 3));
fn2 = subs(fn2, diff(y, x, 3), diff(dy, x, 2));
fn2 = subs(fn2, diff(y, x, 2), diff(dy, x));
fn2 = subs(fn2, diff(y, x), dy)

返回

fn2(x) =

y(x) + (h^4*diff(dy(x), x, x))/24 + (h^2*(dy(x) + 2))/2 + (h^5*diff(dy(x), x, x, x))/120 + (h^3*diff(dy(x), x))/6 + h*(2*x + y(x) - 1)
于 2015-11-12T16:33:18.300 回答