簡體   English   中英

替換 MATLAB 中的符號導數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM