如何根据变量拆分函数?

14次浏览(过去30天)
嗨。我想根据变量拆分函数。
例如
F (x1,x2,y1,y2) = 10*x1 + 20*x2 + 10*y1 + 10*y2;
我想像下面这样分割。
F (x1) = 10*x1;
F (x2) = 20*x2;
F (y1) = 10*y1;
F (y2) = 20*y2;
请帮帮我……!
2的评论
大富豪
大富豪 2021年9月30日
我想我举错了例子....很抱歉。
如果有一个更复杂的功能,我怎么能自动做到这一点?
这意味着我不需要对函数f(x1) f(x2) f(y1) f(y2)逐一编码。
F (x1,x2,y1,y2) = 10*x1 + 20*x2 + 10*y1 + 10*y2 + logx1 + 1/x1 + 1/y1;
F (x1) = 10*x1 + log(x1) + 1/x1;
F (x2) = 20*x2;
F (y) = 10*y + 1/y;
F (y2) = 20*y2;

登录评论。

接受的答案

为副总经理
为副总经理 2021年9月30日
编辑:为副总经理 2021年9月30日
也许有更好的方法,但我从不使用象征性的东西。我把这个扔在那里。在本例的范围内,为了清晰起见,我重命名了这些函数。
信谊X1 x2 y1 y2
Fparent (x1,x2,y1,y2) = 10*x1 + 20*x2 + 10*y1 + 10*y2 + log(x1) + 1/x1 + 1/y1;
C = cell2sym(children(fparent))
C =
f_x1(x1) = sum(C(has(C,x1)))
f_x1 (x1) =
f_x2(x2) = sum(C(has(C,x2)))
f_x2 (x2) =
f_y1(y1) = sum(C(has(C,y1)))
f_y1 (y1) =
f_y2(y2) = sum(C(has(C,y2)))
f_y2 (y2) =
如果您使用的是比R2020b更老的东西,则必须删除cell2sym()调用。
请注意,这一切都假设表达式是一个简单的和(因此使用sum()来重构子表达式)。如果函数表达式是这样的会发生什么?
fparent (x1, x2, y1, y2) = exp (x1 * sin(日志(x2))) / (y1 * x1 + (y2)每股);
2的评论
大富豪
大富豪 2021年9月30日
谢谢你的好意!!
C = cell2sym(children(fparent))
这段代码运行良好^^

登录评论。

更多答案(1)

沃尔特·罗伯森
沃尔特·罗伯森 2021年9月30日
信谊X1 x2 y1 y2
F (x1,x2,y1,y2) = 10*x1 + 20*x2 + 10*y1 + 10*y2 + logx1 + 1/x1 + 1/y1;
fx1 = mapSymType(f,“+”, @(X) SelectPlus(X, x1))
Fx1 (x1, x2, y1, y2) =
fx2 = mapSymType(f,“+”, @(X) SelectPlus(X, x2))
Fx2 (x1, x2, y1, y2) =
fy1 = mapSymType(f,“+”, @(X) SelectPlus(X, y1))
Fy1 (x1 x2 y1 y2) =
fy2 = mapSymType(f,“+”, @(X) SelectPlus(X, y2))
Fy2 (x1 x2 y1 y2) =
函数select = SelectPlus(表达式,var)
ch = children(Expression);
selected_ch = ch(cellfun(@(X) ismember(var, symvar(X)), ch));
Selected = sum([selected_ch{:}]);
如果isempty(选择);select = sym(0);结束
结束

标签

社区寻宝

在MATLAB Central中寻找宝藏,并了解社区如何帮助您!

开始狩猎!