mhkmars 发表于 2011-1-8 21:21

关于符号变量表达式应用于解方程的问题

大家好!
我现在用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=;
比如说这里面的x1,x2最先都是符号变量,然后经过一系列的运算得到了a,和b的表达式,现在要将a,b组成函数,应该如何操作?

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

向前看 发表于 2011-1-8 22:35

以前 也想过这种问题的解决方式,但是最后没有成功,尽量想办法用数值的方式解决吧

mhkmars 发表于 2011-1-8 22:58

回复 2 # 向前看 的帖子

但是我要的方程他的表达式很复杂,只能通过符号计算的到一个表达式。。

tenglang 发表于 2011-1-8 23:04

楼上的,你往group传递的是什么样的参数? 数值?

ChaChing 发表于 2011-1-9 00:01

回复 1 # mhkmars 的帖子

help eval ??

mhkmars 发表于 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组合起来,实现解一个方程组呢?

mhkmars 发表于 2011-1-9 00:10

回复 4 # tenglang 的帖子

我是想把最后的到的符号表达式用于解方程组,group的参数是数值

ChaChing 发表于 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

qibbxxt 发表于 2011-1-9 07:17

字符串生成函数是str2func,这个在simwe里面roc已经回复你了
另外,请你给出更为具体的一个例子,大家好帮你分析

ChaChing 发表于 2011-1-9 11:18

本帖最后由 ChaChing 于 2011-1-9 11:18 编辑

mhkmars 发表于 2011-1-9 00:10 http://www.chinavib.com/static/image/common/back.gif
回复 4 # tenglang 的帖子

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

mhkmars 发表于 2011-1-9 14:16

回复 9 # qibbxxt 的帖子

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

end
p=sum(x);
q=sum(y);
b=p-3; %最终待解的表达式
c=q+5; %最终待解的表达式
eval(['f=@(x1,y1)',char(a(1))])
eval(['g=@(x2,y2)',char(a(2))])
eval(['e=@(x1,x2)',char(p)])
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命令,其格式为=fsolve('func',x0),所以我想把得到的这四个表达式写在一个function里。
2。如果第一个问题能够解决,并且生成了函数,接下来是第二个问题。在实际中我的x是一个1x12sym的一个变量,y也是1x12sym。那么这样得到的a就很多了,我想知道怎样批量的运用eval(['f=@(x1,y1)',char(a(1))])(因为这里变量较少,我就一个一个的敲进去了),然后再形成可以使用的方程组

mhkmars 发表于 2011-1-9 14:17

回复 10 # ChaChing 的帖子

x1,x2其实是我要求的未知数
但是由于我要得到方程才能解出x1,x2,所以我先把他们申明为符号变量,便于得到我想要的方程。

mhkmars 发表于 2011-1-9 14:19

回复 8 # ChaChing 的帖子

这个例子是个线性的,但是我的表达式最后出来时个非线性的,需要求得数值解,需要使用fsolve

qibbxxt 发表于 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.用子函数clear;clc;close all
strf={'sin(x(1))+x(2)+x(3)^2*exp(x(1))-4',...;
'x(1)+x(2)*x(3)',...
'x(1)*x(2)*x(3)'};
x=;
fsolve(@(x)myfunex0109(x,strf),x)function y=myfunex0109(x,strf)
strf=cellfun(@str2func,strcat({'@(x)'},strf'),'UniformOutput',false);
y=arrayfun(@(x0)strf{x0}(x),1:length(strf));
Equation solved.

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

<stopping criteria details>


ans =

-0.0002 0.0001 2.00032.用内嵌函数function y=myex0109
strf={'sin(x(1))+x(2)+x(3)^2*exp(x(1))-4',...;
'x(1)+x(2)*x(3)',...
'x(1)*x(2)*x(3)'};
x0=;
y=fsolve(@myfunex0109,x0);
function y=myfunex0109(x)
strf1=cellfun(@str2func,strcat({'@(x)'},strf'),'UniformOutput',false);
y=arrayfun(@(x0)strf1{x0}(x),1:length(strf));
end
end

Equation solved.

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

<stopping criteria details>


ans =

   -0.0002    0.0001    2.0003

bainhome 发表于 2011-1-12 02:48

本帖最后由 bainhome 于 2011-1-12 02:56 编辑

用函数来生成函数,还有两种方式?如此精彩的回复,qibbxxt两个论坛追着回答,问问题的人两边连个P都没放一个就玩儿消失?!
稀罕!所以我单纯来鼓个掌!让回答问题的人不至于心凉到脚后跟去!
页: [1] 2
查看完整版本: 关于符号变量表达式应用于解方程的问题