EDA365电子论坛网
标题: 请教大神,有什么办法可以替换? [打印本页]
作者: MOTOACE 时间: 2020-5-29 19:27
标题: 请教大神,有什么办法可以替换?
本帖最后由 MOTOACE 于 2020-5-29 19:28 编辑
' N+ c. [4 t, `' Y1 X$ R4 ?" Z7 |# K
要实现的功能:将已知表达式的分段函数中的变量进行替换。比如有一个分段函数
% U; P7 ?; b* ]! M- I6 H3 V; X1 E% X& s* X! n2 m
用siny替换x,理想的转换效果:
# X' ~- ]* g: }# t& i0 I6 K
我的程序实现如下所示:
- syms x
- f = piecewise(0< x <=1, x/6, 1 < x <= 2, -3*x^3); %原始分段函数的表达式
- f_char=char(f); %先把表达式变成字符串
- f_char=strrep(f_char,’x’,’siny’); %对字符串里的内容进行我想要的替换
- f=eval(f_char); %再把字符串变回表达式
1 g& T/ ~$ l9 I. d
0 f7 O+ n) A0 D; E( G# s- t
' z, t/ c( N s! ]/ r
+ k2 r a+ ^! E6 e# M, X " V1 f+ b$ i7 Z7 k1 C9 k
但是遇到了问题,分段函数 f 会被自动改写成:
- piecewise(x in Dom::Interval(0, [1]), x/6, x in Dom::Interval(1, [2]), -3*x^3). s8 X3 m7 @1 |& T
4 r0 V5 U; r2 @( E
8 Y; X- @# B1 ^& y: p
各位可以看看f的输出,会变成上面这个样子。
) L, `; P* M- |! \5 ` X( M" Z y由于出现了 in Dom::Interval 这些无法被计算的字符,因此eval会报错,导致无法表示成表达式。
9 `9 R- m2 c- D/ L. k& g3 p
/ E/ y+ w! k$ B4 u2 z3 F9 V* [( J
请教大神,有什么办法可以替换?非常感谢!
" _, l5 Y+ J/ Y. r/ x6 F
作者: leleeda 时间: 2020-5-29 19:56
# X2 v8 a L! a4 k$ ?1、有看函数的帮助吗?0< x <=1 可以这样写??? siny,可以这样写吗???
( y8 ?$ k/ k6 M+ b; I& z: V2、为何开始就用sym的piecewise,不可以直接用字符吗?替换之后再转。2 C: n( F$ }- m! _
3、你的例子替换有意义不?sin(y)在-1,1之间。1 V0 q) f5 g: ?( F$ x
f = 'piecewise(0< x & x<=1, x/6, 1 < x & x<= 2, -3*x^3)';4 j$ B7 h3 {+ G+ J# o! B+ L
f_char=strrep(f,'x','sin(y)');
& x" J& \% Y3 _3 |4 Zf1=str2sym(f_char);3 s4 _% w6 J+ m" Z! v
y=1;subs(f1)
" y, j! N8 d4 Y! K. F6 \9 Ry=-1;subs(f1)2 M, D* w9 u6 [9 ^/ }
6 _$ W( P( h% q1 p: \7 `. L* z4 _$ A" A/ L7 t2 P* y- }* q
ans =sin(1)/6" C0 U: ]6 A8 U! R7 s
ans =NaN# E7 h) r8 N A7 z# n; l" Y
; [3 R* ?! q; a# K0 W暂时想到能用subs赋值。不知道是否有其他的。
| 欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) |
Powered by Discuz! X3.2 |