24小时热门版块排行榜    

查看: 1070  |  回复: 8

DRAGONZXD

新虫 (初入文坛)

[求助] Mathematica求助 泰勒展开和求导 已有1人参与

求教Mathematica:

多元函数展开后(Series[]),比如x展开到m次,y展开到n次,怎么只保留m+n<4的项?

多谢!!
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

walk1997

金虫 (著名写手)

f[x_, y_] := Sin[x + y];
test = Normal[Series[f[x, y], {x, 0, 4}, {y, 0, 4}]];
test = test // Expand
test = test /. {x^n1_.*y^n2_. /; (n1 + n2 >= 4) -> 0}
2楼2015-04-23 06:46:30
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

DRAGONZXD

新虫 (初入文坛)

引用回帖:
2楼: Originally posted by walk1997 at 2015-04-23 06:46:30
f := Sin;
test = Normal[Series];
test = test // Expand
test = test /. {x^n1_.*y^n2_. /; (n1 + n2 >= 4) -> 0}

多谢啊!
如果自变量特别多,比如Sin[a+b+c+d+....],那么多项式就有很多种组合,怎么舍去任意组合的高次的项呢?(不是手动的找有哪些组合)
谢谢!
3楼2015-04-27 17:45:06
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

walk1997

金虫 (著名写手)

对这种多项式处理不是很熟  另外对模式的理解个人还不是很深入 只能用比较笨的方式
下面的代码是比较笨的方法解决你这个问题

例子是7个变量泰勒展开,只取总的次数小于5的项。
个人感觉mathematic应该有更简单的方式只需要构造单个的rule 挑选出所需的项,不过我没找到这样的函数,只好用字符的方式和多个rule来实现这种笨挑选。

f[x__] := Sin[Total[x]];
x = {a, b, c, d1, d2, d3, d4};
n = 5;
test = f[x]
jihe = Delete[Subsets[x], 1];
rule = Map[((Times @@
        Table[#[]^ToExpression[("n" <> ToString <> "_."], {i,
          1, Length[#]}]) /;
      Evaluate[
       Total[Table[
          ToExpression[("n" <> ToString)], {i, 1, Length[#]}]] >=
        n]) -> 0 &, jihe]
Do[
test = ExpandAll[Normal[Series[test, {x[], 0, n - 1}]]];
test = test /. rule;
, {i, 1, Length[x]}]
test
4楼2015-05-05 22:05:30
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

walk1997

金虫 (著名写手)

上面包含了i] 出错  改成k
f[x__] := Sin[Total[x]];
x = {a, b, c, d1, d2, d3, d4};
n = 5;
test = f[x]
jihe = Delete[Subsets[x], 1];
rule = Map[((Times @@
        Table[#[[k]]^ToExpression[("n" <> ToString[k] <> "_."], {k,
          1, Length[#]}]) /;
      Evaluate[
       Total[Table[
          ToExpression[("n" <> ToString[k])], {k, 1, Length[#]}]] >=
        n]) -> 0 &, jihe]
Do[
test = ExpandAll[Normal[Series[test, {x[[k]], 0, n - 1}]]];
test = test /. rule;
, {k, 1, Length[x]}]
test
5楼2015-05-05 22:07:11
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

walk1997

金虫 (著名写手)

晕  粘贴还有问题 把" 也改了吧
f[x__] := Sin[Total[x]];
x = {a, b, c, d1, d2, d3, d4};
n = 5;
test = f[x]
jihe = Delete[Subsets[x], 1];
rule = Map[((Times @@
        Table[#[[k]]^ToExpression["n" <> ToString[k] <> "_."], {k, 1,
          Length[#]}]) /;
      Evaluate[
       Total[Table[
          ToExpression[("n" <> ToString[k])], {k, 1, Length[#]}]] >=
        n]) -> 0 &, jihe]
Do[
test = ExpandAll[Normal[Series[test, {x[[k]], 0, n - 1}]]];
test = test /. rule;
, {k, 1, Length[x]}]
test
6楼2015-05-05 22:09:37
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

walk1997

金虫 (著名写手)

运行结果
a - a^3/6 + b - (a^2 b)/2 - (a b^2)/2 - b^3/6 + c - (a^2 c)/2 -
a b c - (b^2 c)/2 - (a c^2)/2 - (b c^2)/2 - c^3/6 + d1 - (a^2 d1)/2 -
  a b d1 - (b^2 d1)/2 - a c d1 - b c d1 - (c^2 d1)/2 - (a d1^2)/2 - (
b d1^2)/2 - (c d1^2)/2 - d1^3/6 + d2 - (a^2 d2)/2 - a b d2 - (
b^2 d2)/2 - a c d2 - b c d2 - (c^2 d2)/2 - a d1 d2 - b d1 d2 -
c d1 d2 - (d1^2 d2)/2 - (a d2^2)/2 - (b d2^2)/2 - (c d2^2)/2 - (
d1 d2^2)/2 - d2^3/6 + d3 - (a^2 d3)/2 - a b d3 - (b^2 d3)/2 -
a c d3 - b c d3 - (c^2 d3)/2 - a d1 d3 - b d1 d3 - c d1 d3 - (
d1^2 d3)/2 - a d2 d3 - b d2 d3 - c d2 d3 - d1 d2 d3 - (d2^2 d3)/2 - (
a d3^2)/2 - (b d3^2)/2 - (c d3^2)/2 - (d1 d3^2)/2 - (
d2 d3^2)/2 - d3^3/6 + d4 - (a^2 d4)/2 - a b d4 - (b^2 d4)/2 -
a c d4 - b c d4 - (c^2 d4)/2 - a d1 d4 - b d1 d4 - c d1 d4 - (
d1^2 d4)/2 - a d2 d4 - b d2 d4 - c d2 d4 - d1 d2 d4 - (d2^2 d4)/2 -
a d3 d4 - b d3 d4 - c d3 d4 - d1 d3 d4 - d2 d3 d4 - (d3^2 d4)/2 - (
a d4^2)/2 - (b d4^2)/2 - (c d4^2)/2 - (d1 d4^2)/2 - (d2 d4^2)/2 - (
d3 d4^2)/2 - d4^3/6

没好好看 应该是没问题
7楼2015-05-05 22:10:28
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

gsview

木虫 (小有名气)

【答案】应助回帖

★ ★ ★ ★ ★
DRAGONZXD: 金币+5, ★★★很有帮助 2015-06-02 21:41:18
看了walk1997的程序觉得那个rule还是太复杂。
其实楼主的要求就是想把各变量的幂次能合起来,其实很简单,只需要在你想要合起来的变量都给一个参数就可以了。
例如
f[x__] := Sin[Total[x]];
x = {a, b, c};
x1=x*h
这样你把f[x1]对x在0点展开的时候h的幂次就所有变量的幂次的和。
而且你还可以进一步复杂,例如a和b的幂次之和不能大于n,b和c的幂次之和不能大于m,总幂次又要小于L,那你就相应的把这些都给一个一样的参数就可以了,那x1={a*h1*h,b*h1*h2*h,c*h2*h},

这样筛选的rule就可以很简单的是
rule={h1^j1_/;(j1>n)->0,h2^j2_/;(j2>m)->0,h^j_/;(j>=L)->0}


稍微改一下walk的程序就是

f[x__] := Sin[Total[x]];
x0 = {a, b, c, d, e};
x = x0*h;

n = 5;

test = f[x];

rule = {h^n_ /; (n > 4) -> 0};

Do[test = ExpandAll[Normal[Series[test, {x0[[k]], 0, n - 1}]]];
test = test /. rule;
, {k, 1, Length[x]}]
test = test /. {h -> 1};
8楼2015-05-10 15:07:47
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

walk1997

金虫 (著名写手)

引用回帖:
8楼: Originally posted by gsview at 2015-05-10 15:07:47
看了walk1997的程序觉得那个rule还是太复杂。
其实楼主的要求就是想把各变量的幂次能合起来,其实很简单,只需要在你想要合起来的变量都给一个参数就可以了。
例如
f := Sin;
x = {a, b, c};
x1=x*h
这样你把 ...

good idea! 3x
你引入了一个很巧妙的参数
我的办法太直接,太笨.

你的处理可以看成是2个rule的叠加
1:  x-> h*x
2: h^n_/n>4 ->0
9楼2015-05-10 17:28:55
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 DRAGONZXD 的主题更新
信息提示
请填处理意见