声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 19048|回复: 32

[编程技巧] 【原创】变参数非线性方程组的求解!

[复制链接]
发表于 2006-7-5 23:02 | 显示全部楼层 |阅读模式

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

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

x
对于求解非线性方程组一般用fsolve命令就可以了,但是对于方程组中某一系数是变化的,该怎么求呢?

%定义方程组如下,其中k为变量
function F = myfun(x,k)
H=0.32; Pc0=0.23; W=0.18;
F=[Pc0+H*(1+1.5*(x(1)/W-1)-0.5*(x(1)/W-1)^3)-x(2);  x(1)-k*sqrt(x(2))];

%求解过程
H=0.32; Pc0=0.23; W=0.18;
x0 = [2*W; Pc0+2*H];           % 取初值
options = optimset('Display','off');
k=0:0.01:1;             % 变量取值范围[0 1]
for i=1:1:length(k)
kk=k(i);                        
x = fsolve(@(x) myfun(x,kk), x0, options);%求解非线性方程组
x1(i)=x(1); x2(i)=x(2);
end
plot(k,x1,'-b',k,x2,'-r'); xlabel('k'); legend('x1','x2')

很简单,大家见笑了!

[ 本帖最后由 ChaChing 于 2009-9-9 22:09 编辑 ]
k-x1.x2.JPG

评分

1

查看全部评分

回复
分享到:

使用道具 举报

发表于 2006-7-6 22:36 | 显示全部楼层
不用谦虚哦,大家到这里来就是相互学习的啊!
发表于 2006-7-24 19:58 | 显示全部楼层
不要谦虚了
大哥太感谢了
我也作了一个,但是总是出问题,好好研究一下你的,虽然别人说太简单了
但是对于我这种初学,不深的人来说,
简直太好了。。。

x = fsolve(@(x) myfun(x,kk), x0, options);%求解非线性方程组

这个怎么解释,有点问题哦
 楼主| 发表于 2006-7-30 17:37 | 显示全部楼层
不好意思,前几天不在。
其实这一问题的关键求解就在于:
x = fsolve(@(x) myfun(x,kk), x0, options);%求解非线性方程组。
这里把kk作为第二个参数代入非线性方程组,然后求得某一kk值时的解,释放kk。然后继续循环kk。这样就可以得到整个kk取值区间上的解了。
具体内容可以参考Matlab help中的fslove中 的变参数部分。
发表于 2006-8-7 21:33 | 显示全部楼层
x = fsolve(@(x) myfun(x,kk), x0, options);%求解非线性方程组。
这句话好像matlab 6.5 里通不过呀,
Line: 15 Column: 13
"identifier" expected, "(" found.
能否请解释一下
发表于 2006-8-19 15:56 | 显示全部楼层
??? Error: File: D:\MATLAB6p5\work\Untitled2222.m Line: 16 Column: 13
"identifier" expected, "(" found.
同样的问题怎么回事 阿?
 楼主| 发表于 2006-8-19 21:45 | 显示全部楼层
我是在7的环境下面运行的,具体的6.5的情况不太清楚。不好意思。
发表于 2006-10-19 14:05 | 显示全部楼层
不错 我是刚学的  半天纔農明白

[ 本帖最后由 无水1324 于 2007-7-23 12:06 编辑 ]
发表于 2006-10-19 18:07 | 显示全部楼层
如果KK值事先不能确定,都要靠前一次的计算结果迭代产生,应该怎么办啊
发表于 2006-10-20 15:31 | 显示全部楼层
原帖由 jaguar 于 2006-8-7 21:33 发表
x = fsolve(@(x) myfun(x,kk), x0, options);%求解非线性方程组。
这句话好像matlab 6.5 里通不过呀,
Line: 15 Column: 13
"identifier" expected, "(" found.
能否请解释一下



6.5的调用格式有点不一样,只用修改一下这一句就行了
  1. x = fsolve(@myfun, x0, options,kk);%求解非线性方程组
复制代码
发表于 2006-10-20 15:32 | 显示全部楼层
原帖由 wugang326 于 2006-10-19 18:07 发表
如果KK值事先不能确定,都要靠前一次的计算结果迭代产生,应该怎么办啊


这里再把完整的程序帖一下,实际上只是改动了一个句子:
  1. H=0.32; Pc0=0.23; W=0.18;
  2. x0 = [2*W; Pc0+2*H];           % 取初值
  3. options = optimset('Display','off');
  4. k=0:0.01:1;             % 变量取值范围[0 1]
  5. for i=1:1:length(k)
  6. kk=k(i);                        
  7. x = fsolve(@myfun, x0, options,kk);%求解非线性方程组
  8. x1(i)=x(1); x2(i)=x(2);
  9. end
  10. plot(k,x1,'-b',k,x2,'-r'); xlabel('k'); legend('x1','x2')
复制代码
  1. function F = myfun(x,k)
  2. H=0.32; Pc0=0.23; W=0.18;
  3. F=[Pc0+H*(1+1.5*(x(1)/W-1)-0.5*(x(1)/W-1)^3)-x(2);
  4.     x(1)-k*sqrt(x(2))];
复制代码

[ 本帖最后由 ChaChing 于 2009-2-26 13:58 编辑 ]

评分

1

查看全部评分

发表于 2006-12-22 20:00 | 显示全部楼层
将k设为全局变量,应该也可以解决这个问题吧。

评分

1

查看全部评分

发表于 2007-6-8 23:06 | 显示全部楼层
好,不错。
谢谢。:lol
发表于 2007-7-23 11:55 | 显示全部楼层
好文章,俺给顶起来
发表于 2007-11-1 11:01 | 显示全部楼层
为什么同样的程序到我机子上就不能运行呢?
是我装的软件的问题吗?疑惑中……我的也是7.0版本……
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-11-29 08:35 , Processed in 0.063059 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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