[英]Replacing symbolic derivatives in MATLAB
我有一個看起來像這樣的符號函數
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, ...)
。 我希望有一種更清潔的方法來處理這個問題。
您需要記住,Matlab 將diff(y,x)
和diff(y,x,2)
視為不同的變量。 它不知道如何將diff(y,x)
替換為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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.