关于matlab一次求解很多个形式相同的方程组

需要求解1000个方程组,这些方程组都是一元三次,且具有同样的形式,只是系数不一样,其形式如下:p1(:).t^3+p2(:).t^2+p3(:).t=x其中p1、p2和... 需要求解1000个方程组,这些方程组都是一元三次,且具有同样的形式,只是系数不一样,其形式如下:
p1(:).t^3+p2(:).t^2+p3(:).t=x 其中p1、p2和p3都是1000*1的数组, x为一个数值

我写的代码如下(随便给出p1、p2和p3、x 的数值):
p1=rand(1000,1); p2=rand(1000,1); p3=rand(1000,1); x=0.1;
sym t
eq=p1(:).t^3+p2(:).t^2+p3(:).t-x
t=solve(eq);

悲剧的是,这样解不出来,个人想可能是因为 t 的定义不对,请问该如何解决? 十分感激!!!!!!!
展开
tianxiawulang
2013-03-01 · TA获得超过2.7万个赞
知道大有可为答主
回答量:4732
采纳率:89%
帮助的人:2632万
展开全部
代码不长,问题可不少:

1、第二行:
定义符号变量应该用syms t,而不是sym t(如果用sym函数,则应该返回参数t=sym(t));

2、第三行:
eq=p1(:).t^3+p2(:).t^2+p3(:).t-x

首先,相乘应该用“*”,而不是“.”;
其次,如果你把方程组写到一起,则求解时会被认为联立求解。我猜测你的1000个方程应该是独立求解的,这与你的希望不符。

3、如果想求数值解,可考虑用roots,速度比起求符号解相差无数倍。只需把循环体里面的内容改成下面的代码即可:
T(i,:)=roots([p1(i) p2(i) p3(i) -x]);

以下是改后的参考代码(每个方程的根保存为一行):
p1=rand(1000,1); p2=rand(1000,1); p3=rand(1000,1); x=0.1;
T = sym(zeros(1000,3));
for i=1:length(p1)
syms t
eq=p1(i)*t^3+p2(i)*t^2+p3(i)*t-x;
T(i,:)=solve(eq).';
end
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
evolmath
2013-03-01 · TA获得超过2745个赞
知道小有建树答主
回答量:413
采纳率:100%
帮助的人:237万
展开全部
先不说方程个数与自变量的关系,solve这个命令不是“万能”的,即简单方程一般没问题,但难的,特别是非线性的就很难处理,有可能得不到解析解

另外,一元三次方程,一个方程就能得到结果,要么三个实根,要么一个实根两个共轭复根,这种情况solve可以解决

但方程个数多于一个时,即方程个数比自变量个数多,是个超定非线性方程组,在这个问题里,solve根本没办法

为解决以上问题,可选用数值求解命令fsolve

要说明的是,很可能选用的数据本身就导致方程组无解,这时可以选择一个使方程成立的近似解,即最小二乘法来处理

先写个m文件(即方程组)
function y=funz(t,a,b)
y=a*[t^3;t^2;t^1]-b;

再输入:
n=1000;
a=rand(n,3);
b=rand(n,1);
t0=1;
[t,fv,ef,out,jac]=fsolve(@funz,t0,[],a,b)

输出的t为所求
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式