2015-11-12 46 views
1

我有一個象徵性的功能,看起來像這樣更換象徵衍生物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 term有(h^5*diff(dy(x), x, x, x)。有沒有辦法做到這一點?

我目前的方法是非常hackish,涉及將sym轉換爲字符串,用dy替換一階導數,然後轉換回sym並評估以將序列中每個項的順序減1,但它必須是遞歸的,因爲在每個階段dy的衍生物然後被含有diff(y, ...)的東西取代。我希望有一個更清晰的方式來處理這個問題。

+0

注意,爲了清楚起見,'diff(y(x),x,x,x,x)'等價於'diff(y(x),x,4)'。 – horchler

回答

1

您需要記住,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) 

或者你可以離開​​作爲一個抽象的符號表達最初:

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)