查看: 144|回复: 3|关注: 0

[已解决] 求解大量的具有相同格式的两元方程组

[复制链接]

新手

7 麦片

财富积分


050


2

主题

4

帖子

0

最佳答案
本帖最后由 图图图图萌萌哒 于 2020-2-12 20:54 编辑

要求解的方程组为:
eq1:    p1.*t.^2+p2.*t.^2+2.*tt-x=0;
eq2:    p1+p2+x+3.*tt+t./p1=0;
其中,t,tt为要求解的未知数,p1,p2为已知系数,通过excel导入(均有1000个取值),x为常数5. 想要求当方程系数p1 p2分别为  p1(1),p2(1)    p1(2),p(2)......p1(1000),p2(1000)时所对应方程的解t(1),tt(1)   t(2),tt(2) ...... t(1000),tt(1000)    应该如何编程呢?
已经尝试了定义了一个函数 function1,然后再调用,发现当给p1 p2分别只赋一个值时,能够正常求解,但当使用导入的excel数据赋值时却求解出错
function [t,tt] = function1(p1,p2)
x=5;
syms t tt
eq1=p1.*t.^2+p2.*t.^2+2.*tt-x;
eq2= p1+p2+x+3.*tt+t./p1;
[t,tt] =vpasolve(eq1==0,eq2==0,t,tt)
end

                               
登录/注册后可看大图

p1=xlsread('C:\Users\DS\Desktop\111.xlsx','sheet1','B1:B1000');  p1=p1';
p2=xlsread('C:\Users\DS\Desktop\111.xlsx','sheet1','C1:C1000');  p2=p2';
function1(p1,p2)

出错代码:
错误使用 sym.getEqnsVars>checkVariables (line 92)
Second argument must be a vector of symbolic variables.

出错 sym.getEqnsVars (line 62)
    checkVariables(vars);

出错 sym/vpasolve (line 132)
    [eqns,vars] = sym.getEqnsVars(varargin{1:N});

出错 function1 (line 6)
[t,tt] =vpasolve(eq1==0,eq2==0,t,tt)

出错 Untitled8 (line 3)

于是又网上查询了一下别的方法,发现以下方法针对多组p1 p2求解可行,但只能求解只有一个未知数t的方程:
p1=xlsread('C:\Users\DS\Desktop\111.xlsx','sheet1','B1:B1000');
p2=xlsread('C:\Users\DS\Desktop\111.xlsx','sheet1','C1:C1000');
x=5;
T=sym(zeros(1000,3));
for i=1:length(p1)
syms t
eq=p1.*t.^2+p2.*t.^2-x;
T(i,:)=vpasolve(eq);
T(i,:)=vpa(T(i,:));
end
T

                               
登录/注册后可看大图

想请问下各位老师,这两种方法应该怎么改代码能够实现:求解大量的具有相同格式(仅系数的数值不同)的二元方程的根(数值解):) 感激不尽



论坛优秀回答者

5

主题

1771

帖子

505

最佳答案
  • 关注者: 152
发表于 2020-2-13 07:04:44 | 显示全部楼层 |此回复为最佳答案
方程组比较简单,直接将p1 p2定义为符号变量,求未知数的符号解,把符号解当做以p1 p2为自变量的函数,带入数值挨个求数值就是了
  1. x = 5;
  2. syms t tt p1 p2
  3. eq1 = p1 .* t.^2 + p2 .* t.^2 + 2 .* tt - x;
  4. eq2 = p1 + p2 + x + 3.* tt + t ./ p1;
  5. [ t, tt ] = solve( [ eq1 == 0, eq2 == 0 ], [ t, tt ] )
复制代码


符号解(因为方程含平方项,解有两组)
t =
(30*p1^2*p2 - 9*((8*p1^4)/27 + (16*p1^3*p2)/27 + (100*p1^3)/27 + (8*p1^2*p2^2)/27 + (100*p1^2*p2)/27 + 4/81)^(1/2) + 12*p1^3*p2 + 30*p1^3 + 6*p1^4 + 6*p1^2*p2^2 + 2)/(6*p1*(p1 + p2)) - p1*p2 - p1^2 - 5*p1
(9*((8*p1^4)/27 + (16*p1^3*p2)/27 + (100*p1^3)/27 + (8*p1^2*p2^2)/27 + (100*p1^2*p2)/27 + 4/81)^(1/2) + 30*p1^2*p2 + 12*p1^3*p2 + 30*p1^3 + 6*p1^4 + 6*p1^2*p2^2 + 2)/(6*p1*(p1 + p2)) - p1*p2 - p1^2 - 5*p1

tt =
-(30*p1^2*p2 - 9*((8*p1^4)/27 + (16*p1^3*p2)/27 + (100*p1^3)/27 + (8*p1^2*p2^2)/27 + (100*p1^2*p2)/27 + 4/81)^(1/2) + 12*p1^3*p2 + 30*p1^3 + 6*p1^4 + 6*p1^2*p2^2 + 2)/(18*p1^2*(p1 + p2))
-(9*((8*p1^4)/27 + (16*p1^3*p2)/27 + (100*p1^3)/27 + (8*p1^2*p2^2)/27 + (100*p1^2*p2)/27 + 4/81)^(1/2) + 30*p1^2*p2 + 12*p1^3*p2 + 30*p1^3 + 6*p1^4 + 6*p1^2*p2^2 + 2)/(18*p1^2*(p1 + p2))

  1. t = matlabFunction( t, 'vars', { p1, p2 } );
  2. tt = matlabFunction( tt, 'vars', { p1, p2 } );
  3. p1Value = [ 1; 3; 5 ];
  4. p2Value = [ pi; sqrt( 2 ); -1 ];
  5. tValue = reshape( feval( t, p1Value, p2Value ), [ numel( p1Value ), 2 ] ).'
  6. ttValue = reshape( feval( tt, p1Value, p2Value ), [ numel( p1Value ), 2 ] ).'
复制代码


带入数值得到
tValue =
   -1.5582   -1.5733   -1.6417
    1.7192    1.6237    1.6751

ttValue =
   -2.5278   -2.9633   -2.8906
   -3.6203   -3.3185   -3.1117
提问请:①准确描述问题②贴代码别贴代码的截图③勿一问多帖或一帖多问④及时反馈⑤看清回复的每个字

新手

7 麦片

财富积分


050


2

主题

4

帖子

0

最佳答案
 楼主| 发表于 2020-2-13 08:42:40 | 显示全部楼层
TouAkira 发表于 2020-2-13 07:04
方程组比较简单,直接将p1 p2定义为符号变量,求未知数的符号解,把符号解当做以p1 p2为自变量的函数,带入 ...

谢谢您的回答,您的回答非常有效
想请问下,如果该方程中有p1、p2、....p15总共15个符号变量,每个符号变量都有对应的20000个或者更多的数据,想要分别求解这20000个或者更多的方程组,(因为涉及到处理大量的实验数据),您说的先求出未知数的符号解,再把符号解当作以p1、p2、....p15为自变量的函数,带入数据挨个求解,这种方法用时是最短的吗?

论坛优秀回答者

5

主题

1771

帖子

505

最佳答案
  • 关注者: 152
发表于 2020-2-13 10:18:21 | 显示全部楼层
图图图图萌萌哒 发表于 2020-2-12 20:42
谢谢您的回答,您的回答非常有效
想请问下,如果该方程中有p1、p2、....p15总共15个符号变量,每个符号变 ...

如果每组数据之间的方程是一样的仅是数值不同,这样求解当然效率高。写循环对上万组方程逐个求解,当然也是可行的,但会显著地变慢,因为每步都有重复的部分:

打个比方,先求出符号解再带入不同数值,就好比先雕刻一个印刷版,就用这么一个母版每次涂不同的颜色然后印刷;循环逐个求解,则相当于每次都刻一个新版,再涂上对应颜色的墨水印刷。
提问请:①准确描述问题②贴代码别贴代码的截图③勿一问多帖或一帖多问④及时反馈⑤看清回复的每个字
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

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