matlab解方程 sym出现sym

查看: 3654|回复: 0|关注: 0
为什么在matlab中用solve指令解出来会出现empty sym
<h1 style="color:# 麦片财富积分
新手, 积分 5, 距离下一级还需 45 积分
w=sym('w','real');
k2=sym('k2','real');
k3=sym('k3','real');
r=sym('r','real');
n1=[1 0.1];
ns1=poly2sym(n1,'s');
ds1=poly2sym(d1,'s');
wn=subs(ns1,'s',j*w)
wd=subs(ds1,'s',j*w)
d=[1 5 7 3];
ns=poly2sym(n,'s');
ds=poly2sym(d,'s');
nw=subs(ns,'s',j*w)
dw=subs(ds,'s',j*w)
vw=j*w*dw*wd*(cos(st*w)+sin(st*w))+(k1*cos(t1*w)-k1*sin(t1*w)+k2*cos(t2*w)-k2*sin(t2*w)+k3*cos(t3*w)-k3*sin(t3*w))*nw*(wd+1/r*(cos(fy)+sin(fy))*wn)
rv=real(vw)
iv=imag(vw)
[k2,k3]=solve('rv','iv','k2','k3')
为什么运行结果为
[ empty sym ]
站长推荐 /3
车辆动力学工具箱介绍:一款集成3D虚拟环境的汽车仿真产品
MATLAB中文论坛是全球最大的 MATLAB & Simulink 中文社区。用户免费注册会员后,即可下载代码,讨论问题,请教资深用户及结识书籍作者。立即注册加入我们吧!
MATLAB官方社交平台
MATLAB中文论坛微社区(转)[MATLAB]把sym转换为char和把char转换为一个函数句柄
作者:彭军&& 邮件:poonjun at gmail
今天,一个同学碰到一个问题:他的一个方程是用sym类型的变量来表示的,可是在用fsolve解方程的时候的是一个函数句柄(function_handle),但是用slove解方程的话,就不必要是一个函数句柄。那么如果非要用fsolve解方程的话,该如何转换呢。
在这里我选择了一个简单的方程来说明过程:
全部程序如下:
syms f a b
f=1+a*b+b.^2*a.^3+b.^5/(a+b);
fv=cell(5,1);
for i=1:5,
fv(i)=subs(f,a,i);
fid=fopen(['fun' num2str(i) '.m'],'w+');
fwrite(fid,['function f=fun' num2str(i) '(b)']);
fprintf(fid,'\r\n');
fchar=fv{i};
fchar=replace(fchar,'^','.^');
fchar=replace(fchar,'/','./');
fchar=replace(fchar,'*','.*');
fwrite(fid,'f=');
fwrite(fid,fchar);
fwrite(fid,';');
fclose(fid);
h=str2func(['fun' num2str(i)]);
fsolve(h,[-4,4])
用subs代替f中的a之后,即可得到一个在cell类型的变量fv中存储的char类型的变量。然后我们将这些不同a值的方程,写作M文件的形式。然后再次用str2func来把一个字符型的字符串转换为函数句柄。如果需要把函数句柄转换为字符串,请用func2str。
其中用到了replace函数,这个是我自己写的小函数。它的主要作用是将方程中的乘、乘方、除都用点乘、点乘方、点除来表示,因为在用fsolve解方程的时候,它用的是一系列的向量,所以必须用点乘等来代替。
replace函数的内容如下:
function ch=replace(c,old,new)
if ~ischar(c) || ~ischar(old) || ~ischar(new),
&&& disp('the
first argument must be a char');
if length(old)~=1,
&&& disp('the
length of the second argument must be 1.');
&&& disp('the
length of the third argument can be larger than 1.');
nold=find(c==old);
for i=1:length(c),
~isempty(find(i==nold))
ch=[ch new];
ch=[ch c(i)];
运行最上面的程序之后,会有如下的输出:
Maximum number of function evaluations reached:
increase options.MaxFunEvals.
-1.2427&&&
Optimizer appears to be converging to a minimum that is not a
Sum of squares of the function values is &
sqrt(options.TolFun).
Try again with a new starting point.
-1.5131&& -0.1250
Maximum number of function evaluations reached:
increase options.MaxFunEvals.
-3.6493&&&
Optimization terminated: no further progress can be made.
Trust-region radius less than 2*eps.
Problem may be ill-conditioned or Jacobian may be inaccurate.
Try using exact Jacobian or check Jacobian for errors.
Optimizer appears to be converging to a minimum that is not a
Sum of squares of the function values is &
sqrt(options.TolFun).
Try again with a new starting point.
-4.3402&& -0.0200
有人会说,如果不用cell类型的变量fv结果会如何?结果就是你用subs代替之后的返回值,仍然是sym类型的。而不能做到将其从sym类型的变量,转换为char类型的变量。不行请看下面的程序:
1+b*a+b^2*a^3+b^5/(a+b)
&& class(f)
&& cc=subs(f,a,3)
1+3*b+27*b^2+b^5/(3+b)
&& class(cc)
但是,如果用cell类型的变量的话,就会有下面的结果:
&& format compact
&& syms f a b
f=1+a*b+b.^2*a.^3+b.^5/(a+b);
&& class(f)
&& fv=cell(5,1);
&& fv(1)=subs(f,a,1);
'1+b+b^2+b^5/(1+b)'
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&
&& class(fv{1})
不仅如此,而且fv(1)=subs(f,a,1);这句程序不能换为fv{1}=subs(f,a,1);要是这样的话,fv{1}里面的变量的类型仍然是sym的,而不是char的。
本来MATLAB是有一个char2sym的函数的,可是不让我们用,没办法,只好另想其他的办法的了。为什么说MATLAB里面有一个char2sym函数呢?如果你运行help
char2sym的话,只会得到:
char2sym not found.
Use the Help browser Search tab to search the documentation,
type "help help" for help command options, such as help for
所以,是找不到这个函数的。但是,我们运行如下的程序:
1+b*a+b^2*a^3+b^5/(a+b)
&& subs(f,'^','.^')
??? Error using ==& sym.sym&char2sym at 414
Not a valid symbolic expression.
Error in ==& sym.sym at 95
&& S = char2sym(x);
Error in ==& sym.subs&inputchk at 250
elseif ischar(x) && ischar(y) && ...
Error in ==& sym.subs at 107
msg = inputchk(X,Y);
可以看到出错,处在了sym.sym&char2sym at
414,但是我们点击这句话之后,确看不到char2sym函数的内容,而是看到sym.m的函数中的内容,如下:
elseif strncmp(S,'at offset',9)
error('symbolic:sym:sym:errmsg8','Not a valid symbolic
expression.');
error('symbolic:sym:sym:errmsg9',S)
所以,从出错信息看是sym.m函数调用的char2sym函数出错,可是我们找不到char2sym函数,那就说明,MATLAB不想让我们看到char2sym的源代码罢了。
另外,MATLAB自带的subs只能替代一个sym变量中的一个字符换成另外一个字符。而我写的一个replace函数,是可以将一个char变量中的一个字符换成多个字符的。比如:
&& f='1+b*a+b^2*a^3+b^5/(a+b)';
&& replace(f,'*','.*')
1+b.*a+b^2.*a^3+b^5/(a+b)
&& replace(f,'*','.*.*')
1+b.*.*a+b^2.*.*a^3+b^5/(a+b)
所以,以后如果想把一个sym类型的表达式转化为char类型的表达式,中间就要有一个cell类型的变量要充当桥了。如下:
1+b*a+b^2*a^3+b^5/(a+b)
&& class(f)
&& f1=subs(f,a,2)
1+2*b+8*b^2+b^5/(2+b)
&& class(f1)
&& pj=cell(1);
&& pj(1)=subs(f,a,2)
'1+2*b+8*b^2+b^5/(2+b)'
&& class(pj)
&& class(pj{1})
&& b=pj{1};
&& class(b)
1+2*b+8*b^2+b^5/(2+b)
除此之外,我们还有更好的一种将char转换为sym的方法,就是用sym函数。如下:
&& a='x*y+3'
&& class(a)
&& sa=sym(a)
&& class(sa)
同样将sym转换为char的方法,可用char函数,如下:
&& ca=char(sa)
&& class(sa)
&& class(ca)
所以,我们可以把上面的replace函数更改成当被替换的表达式是一个sym类型的变量时,仍可使用,只需要简单的修改如下即可:
function ch=replace(c,old,new)
if strcmp(class(c),'sym'),
c=char(c);
if ~ischar(old) || ~ischar(new),
&&& disp('the
second argument must be a char');
if length(old)~=1,
&&& disp('the
length of the second argument must be 1.');
&&& disp('the
length of the third argument can be larger than 1.');
nold=find(c==old);
for i=1:length(c),
~isempty(find(i==nold))
ch=[ch new];
ch=[ch c(i)];
但是,由于replace函数返回的是char类型,所以,如果用一个double型的变量代替其中的某个值时,不会计算出结果。如下:
&& b='p+3*p';
&& class(b)
&& replace(b,'p','3')
如果需要计算返回的结果,只要用eval函数即可,如下:
&& eval_r(replace(b,'p','3'))
但是MATLAB的subs函数是会计算结果的,不过它不能接受一个char类型的变量作为输入。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。matlab 用solve解方程,出现sym_百度知道
matlab 用solve解方程,出现sym
k)+power((13*exp(87/solve(power((5*sqrt(5)*exp(131/512)/16)syms k delta
我有更好的答案
上面解方程的语句,k,delta都是未知数;512)/16),3)+power((13*exp(87/512)/512)/16),k)-delta,k)-delta,k)Warning: Cannot fi solve(power((5*sqrt(5)*exp(131/16),k)+power((13*exp(87/512)/16),k)+power((13*exp(87/512)&#47. & In solve (line 316)
ans = Empty sym: 0-by-1 上式不能解出;16),可把k指定一个数,如:solve(power((5*sqrt(5)*exp(131&#47,3)-delta) ans = && solve(power((5*sqrt(5)*exp(131/512)/16),一个方程,2个未知数,要求出以其中一个是自变量;&gt,另一个是函数,要这样:&& syms k delta&gt
采纳率:77%
来自团队:
为您推荐:
其他类似问题
&#xe675;换一换
回答问题,赢新手礼包&#xe6b9;
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。Matlab解方程组的结果是这样的?怎么回事啊?我看不懂这个结果,
sym是matlab中的一种结构体类型.如果要变成数值类型需要使用double函数.你可以使用这种方法转换:[x,y,z]=solve('@##$#@$%'); % 输入你的三元方程组x=double(x);y=double(y);z=double(z);
高中数学必修四(和角公式)已知sinα+sinβ=3/5,cosα+cosβ=4/5,求cos(α-β)的值
cos(α-β)=cosαcosβ+sinαsinβ(sinα+sinβ)^2=(sinα)^2+(sinβ)^2+2sinαsinβ所以2sinαsinβ=9/25-(sinα)^2-(sinβ)^2同理2cosαcosβ=16/25-(cosα)^2-(cosβ)^2cos(α-β)=1/2(2cosαcosβ+2sinαsinβ)=1/2[9/25-(sinα)^2-(sinβ)^2+16/25-(cosα)^2-(cosβ)^2]=1/2{(9/25+16/25)-[(sinα)^2+(cosα)^2]-[(sinβ)^2+(cosβ)^2]}因为(sinα)^2+(cosα)^2=1,(sinβ)^2+(cosβ)^2=1所以=1/2[1-1-1]=-1/2 (^2代表平方)
已知f(x)在实数集上是减函数,若a+b≤0,则下列正确的是(  )A. f(a)+f(b)≤-[f(a)+f(b)]B. f(a)+f(b)≤f(-a)+f(-b)C. f(a)+f(b)≥f(-a)+f(-b)D. f(a)+f(b)≥-[f(a)+f(b)]
∵a+b≤0,∴a≤-b,b≤-a,∵f(x)在实数集上是减函数,∴f(a)≥f(-b),f(b)≥f(-a),两式相加,得f(a)+f(b)≥f(-a)+f(-b).故选C.
已知单项式一8a的3x+y+z次幂*b的12次幂*c的x+y+z次幂与2a的4次幂*b的2x一y次幂+3的zc6,请求出x、y、z的值.已知单项式一8a的3x+y+z次幂*b的12次幂*c的x+y+z次幂与2a的4次幂*b的2x一y次幂+3的z次幂*c的6次幂,请求出x、y、z的值.
建立方程组:3x+y+z=4…………①2x-y=12…………②x+y+z=6…………③①-③得2x=-2x=-1将x=-1代入②得-2-y=12y=-14将x=-1,y=-14代入③得-1-14+z=6z=21∴x=-1,y=-14,z=21很高兴为您解答,【学习宝典】团队为您答题.请点击下面的【选为满意回答】按钮,
5的平方-3的平方=8乘2,9的平方-7的平方=8乘4,15的平方-3的平方=8乘27找规律,请问有什么规律再写两个与以上条规律相符的算式,用文字写出上述的规律,证明这个规律的正确性.
(5+3)(5-3)=8*2(9+7)(9-7) 16为8的倍数(15-3)(15+3) 也有3个2别的也是这样即任意因数有2的三次方19的平方-5的平方=8乘4218的平方-6的平方=8乘36
其他相关问题MATLAB解方程组问题wd =
[ empty sym ]
<h1 style="color:# 麦片财富积分
新手, 积分 9, 距离下一级还需 41 积分
没什么问题
还有一个问题,如果只有两个变量,fsolve里的初值给的好的话,解出来的结果与实际结果只相差0.001,而且当fsolve的初值变化时,得出的x1,x2基本不变,也就可以基本确定解了;
但是换成三个变量后,只要改变一点一点fsolve里的值,解出的x1,x2,x3就变化很大,这个怎么解决?
论坛优秀回答者
<h1 style="color:#39 麦片财富积分
关注者: 334
这没法解决,只能说你的方程组对于这些解的误差都很小,你只有不断换初值直到精度满足你要求
或者用循环,初值随机给,直到误差满足要求
<h1 style="color:# 麦片财富积分
这没法解决,只能说你的方程组对于这些解的误差都很小,你只有不断换初值直到精度满足你要求
或者用循环, ...
就下面这个方程组,真实的解为wd=39.90722,jd=116.39139,l=3;我想让给定fsolve里的初值后,wd和jd尽可能解得接近于我给点的真实解,l大于零就行(在不知道真实解得情况下),这该怎样解?
syms wd jd l
q1=(tan(asin(sin(wd*pi/180)*sin(pi/180*23.45*sin(2*pi*(284+295)/365))+cos(wd*pi/180)*cos(pi/180*23.45*sin(2*pi*(284+295)/365))*cos(pi/180*15*(13.15+(jd-120)*4/60-12)))))/l;
q2=1/3.533142;
eq1=q1-q2;
q3=(tan(asin(sin(wd*pi/180)*sin(pi/180*23.45*sin(2*pi*(284+295)/365))+cos(wd*pi/180)*cos(pi/180*23.45*sin(2*pi*(284+295)/365))*cos(pi/180*15*(13.4+(jd-120)*4/60-12)))))/l;
q4=1/3.614934;
eq2=q3-q4;
q5=(tan(asin(sin(wd*pi/180)*sin(pi/180*23.45*sin(2*pi*(284+295)/365))+cos(wd*pi/180)*cos(pi/180*23.45*sin(2*pi*(284+295)/365))*cos(pi/180*15*(13.4+(jd-120)*4/60-12)))))/l;
q6=1/3.614934;
eq3=q5-q6;
eq1=matlabFunction(eq1);
eq2=matlabFunction(eq2);
eq3=matlabFunction(eq3);
y=@(x)[eq1(x(1),x(2),x(3));eq2(x(1),x(2),x(3));eq3(x(1),x(2),x(3))];
[x,fval]=fsolve(y,[113,3,39])& &%这里你得找到合适的迭代初值,以保证误差fval满足你的精度要求& &复制代码
<h1 style="color:# 麦片财富积分
这没法解决,只能说你的方程组对于这些解的误差都很小,你只有不断换初值直到精度满足你要求
或者用循环, ...
大神,期待你的回答
<h1 style="color:# 麦片财富积分
这没法解决,只能说你的方程组对于这些解的误差都很小,你只有不断换初值直到精度满足你要求
或者用循环, ...
还有一个问题,对于上面方程的q1和q2,是不是q1是表达式,q2必须为常数?
<h1 style="color:# 麦片财富积分
这没法解决,只能说你的方程组对于这些解的误差都很小,你只有不断换初值直到精度满足你要求
或者用循环, ...
能不能帮我把程序写一下,不胜感激!大神~~~
论坛优秀回答者
<h1 style="color:#39 麦片财富积分
关注者: 334
把你给的真实解代入方程:
eq1(116..90722)
& &-0.0367
q2不需要是常数
误差远比matlab求出来的解要大
站长推荐 /3
车辆动力学工具箱介绍:一款集成3D虚拟环境的汽车仿真产品
MATLAB中文论坛是全球最大的 MATLAB & Simulink 中文社区。用户免费注册会员后,即可下载代码,讨论问题,请教资深用户及结识书籍作者。立即注册加入我们吧!
MATLAB官方社交平台
MATLAB中文论坛微社区

我要回帖

更多关于 matlab解方程出现警告 的文章

 

随机推荐