声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 6340|回复: 22

[综合讨论] 关于符号变量表达式应用于解方程的问题

  [复制链接]
发表于 2011-1-8 21:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
大家好!
我现在用matlab的符号运算得到了一串表达式,但是变量都是符号变量,现在我需要将这些表达式用于解方程,现在遇到的问题就是怎样将这些符号变量的表达式变成一个function函数里的数值表达式?
我想了一个简单的代码来表达我的意思:
function f=group1(x1,x2)
syms x1 x2
a=x1+x2;
b=x1-x2;
a=char(a);
b=char(b);
a=str2num(a);
b=str2num(b);
f=[a;b];
比如说这里面的x1,x2最先都是符号变量,然后经过一系列的运算得到了a,和b的表达式,现在要将a,b组成函数,应该如何操作?

ps:我的思路是先将符号变量x1和x2变成字符类型,然后用str2num变成function可以使用的数值变量,但是没有成功。。。
希望大家可以讨论讨论
谢谢关注!
回复
分享到:

使用道具 举报

发表于 2011-1-8 22:35 | 显示全部楼层
以前 也想过这种问题的解决方式,但是最后没有成功,尽量想办法用数值的方式解决吧
 楼主| 发表于 2011-1-8 22:58 | 显示全部楼层
回复 2 # 向前看 的帖子

但是我要的方程他的表达式很复杂,只能通过符号计算的到一个表达式。。
发表于 2011-1-8 23:04 | 显示全部楼层
楼上的,你往group传递的是什么样的参数? 数值?
发表于 2011-1-9 00:01 | 显示全部楼层
回复 1 # mhkmars 的帖子

help eval ??
 楼主| 发表于 2011-1-9 00:09 | 显示全部楼层
回复 5 # ChaChing 的帖子

恩,有个网友也提供给我一种用eval指令的方法,现在我可以实现单个变量形成函数,但是却不知如何将这些函数用于解方程,希望给予指导一下
比如说
syms x1 x2
a=x1+x2;
b=x1-x2;
eval(['f=@(x1,x2)',char(a)]);
eval(['g=@(x1,x2)',char(b)]);
f和g都能够用诸如f(2,2)这样的命令调用了
但是如何将f和g组合起来,实现解一个方程组呢?
 楼主| 发表于 2011-1-9 00:10 | 显示全部楼层
回复 4 # tenglang 的帖子

我是想把最后的到的符号表达式用于解方程组,group的参数是数值
发表于 2011-1-9 00:22 | 显示全部楼层
syms x1 x2
a=x1+x2; b=x1-x2;
aa=char(a); bb=char(b);
ff=solve(aa,bb);
ff.x1, ff.x2

评分

1

查看全部评分

发表于 2011-1-9 07:17 | 显示全部楼层
字符串生成函数是str2func,这个在simwe里面roc已经回复你了
另外,请你给出更为具体的一个例子,大家好帮你分析

点评

赞成: 5.0
赞成: 5
  发表于 2011-1-9 11:15
发表于 2011-1-9 11:18 | 显示全部楼层
本帖最后由 ChaChing 于 2011-1-9 11:18 编辑

有点矛盾!?:@)
x1/x2参数是数值, 但又马上syms x1 x2 ???

点评

赞成: 5.0
赞成: 5
所以不好理解,才问了一下  发表于 2011-1-10 12:33
 楼主| 发表于 2011-1-9 14:16 | 显示全部楼层
回复 9 # qibbxxt 的帖子

我举个例子如下,因为我的要解的表达似乎比较复杂,我就简化成下面的:
  1. x=sym(ones(1,2)); %初始化
  2. y=sym(ones(1,2));
  3. %a=sym(ones(1,2));
  4. for i=1:2
  5. x(i)=['x' num2str(i) ]; %定义符号变量
  6. y(i)=['y' num2str(i) ];%定义符号变量
  7. %a(i)=['a' '(' num2str(i) ')'];%定义符号变量
  8. a(i)=x(i)^2+y(i); %a(i)中存放的是最终我想要解的方程表达式

  9. end
  10. p=sum(x);
  11. q=sum(y);
  12. b=p-3; %最终待解的表达式
  13. c=q+5; %最终待解的表达式
  14. eval(['f=@(x1,y1)',char(a(1))])
  15. eval(['g=@(x2,y2)',char(a(2))])
  16. eval(['e=@(x1,x2)',char(p)])
  17. eval(['d=@(y1,y2)',char(q)])
复制代码
x,y其实是我要求的未知数
但是由于我要得到方程才能解出x,y,所以我先把他们申明为符号变量,便于得到我想要的方程。也就是这里面的a(1),a(2),b,c。
然后四个未知数,四个方程,就能解出其数值解。
现在,我用eval指令将每一个表达式都能变成函数。经过command window里面验证,f,g,e,d都是可用的。
接下来问题来了:
1。如何将f,g,e,d等组合成一个function?
    因为在我实际要解的方程中,其实是一个非线性方程组,需要用到fsolve命令,其格式为[x,fval]=fsolve('func',x0),所以我想把得到的这四个表达式写在一个function里。
2。如果第一个问题能够解决,并且生成了函数,接下来是第二个问题。在实际中我的x是一个1x12sym的一个变量,y也是1x12sym。那么这样得到的a就很多了,我想知道怎样批量的运用eval(['f=@(x1,y1)',char(a(1))])(因为这里变量较少,我就一个一个的敲进去了),然后再形成可以使用的方程组

 楼主| 发表于 2011-1-9 14:17 | 显示全部楼层
回复 10 # ChaChing 的帖子

x1,x2其实是我要求的未知数
但是由于我要得到方程才能解出x1,x2,所以我先把他们申明为符号变量,便于得到我想要的方程。
 楼主| 发表于 2011-1-9 14:19 | 显示全部楼层
回复 8 # ChaChing 的帖子

这个例子是个线性的,但是我的表达式最后出来时个非线性的,需要求得数值解,需要使用fsolve
发表于 2011-1-9 22:53 | 显示全部楼层
回复 11 # mhkmars 的帖子

3# mhkmars

要解方程,需要把x,y,z换为x(1),x(2),x(3)

本来想用strrep替换x为x(1),y为x(2),z为x(3),但是这样一来就把exp中的x也替换了,还要判断,太麻烦了
如何用符号变量,速度太慢
所以建议,你还是将x,y,z等写为x(1),x(2),x(3)

下面是我写的一个小例子,可以进行批量处理,N个变量也可以

1.用子函数
  1. clear;clc;close all
  2. strf={'sin(x(1))+x(2)+x(3)^2*exp(x(1))-4',...;
  3. 'x(1)+x(2)*x(3)',...
  4. 'x(1)*x(2)*x(3)'};
  5. x=[1 2 3];
  6. fsolve(@(x)myfunex0109(x,strf),x)
复制代码
  1. function y=myfunex0109(x,strf)
  2. strf=cellfun(@str2func,strcat({'@(x)'},strf'),'UniformOutput',false);
  3. y=arrayfun(@(x0)strf{x0}(x),1:length(strf));
复制代码

  1. Equation solved.

  2. fsolve completed because the vector of function values is near zero
  3. as measured by the default value of the function tolerance, and
  4. the problem appears regular as measured by the gradient.

  5. <stopping criteria details>


  6. ans =

  7. -0.0002 0.0001 2.0003
复制代码
2.用内嵌函数
  1. function y=myex0109
  2. strf={'sin(x(1))+x(2)+x(3)^2*exp(x(1))-4',...;
  3. 'x(1)+x(2)*x(3)',...
  4. 'x(1)*x(2)*x(3)'};
  5. x0=[1 2 3];
  6. y=fsolve(@myfunex0109,x0);
  7. function y=myfunex0109(x)
  8. strf1=cellfun(@str2func,strcat({'@(x)'},strf'),'UniformOutput',false);
  9. y=arrayfun(@(x0)strf1{x0}(x),1:length(strf));
  10. end
  11. end
复制代码


  1. Equation solved.

  2. fsolve completed because the vector of function values is near zero
  3. as measured by the default value of the function tolerance, and
  4. the problem appears regular as measured by the gradient.

  5. <stopping criteria details>


  6. ans =

  7.    -0.0002    0.0001    2.0003

复制代码

点评

赞成: 5.0
赞成: 5
个人习惯跑过再评分, 两位大牛都最高权限了, so...  发表于 2011-1-13 00:25
可以加两个威望的帖子  发表于 2011-1-10 09:15

评分

4

查看全部评分

发表于 2011-1-12 02:48 | 显示全部楼层
本帖最后由 bainhome 于 2011-1-12 02:56 编辑

用函数来生成函数,还有两种方式?如此精彩的回复,qibbxxt两个论坛追着回答,问问题的人两边连个P都没放一个就玩儿消失?!
稀罕!所以我单纯来鼓个掌!让回答问题的人不至于心凉到脚后跟去!

点评

赞成: 3.0
赞成: 3
谢谢老兄捧场  发表于 2011-1-12 13:51

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-17 17:56 , Processed in 0.082115 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表