【调剂】北京石油化工学院2024年16个专业接受调剂
查看: 2112  |  回复: 22

309065816

木虫 (正式写手)

[求助] MATLAB中运算过程中的数据保存以及作图已有1人参与

有如下两个问题请教大家,谢谢先!
1、求解非线性方程ax^3+bx^2+cx+d=0,我用的是matlab自带的roots函数,但是将求解结果代入回原方程后发现方程的最终结果的方次在10^-12左右,远大于eps,这样是否表示方程的求解很不准确?
2、先求y,然后求出对应的x跟z。我的程序中,一个VV对应于3个y值,由于y有三组解,x跟z也同样有3组解一一对应。我想将程序中的3个z值都保存下来,分别与之前的VV一一对应作图,最后应该出来一个呈S型曲线的图。想问问怎么保存数据还有怎么作图?
以下是我自己写的程序,可能有点繁琐。麻烦大家帮帮忙了
clear
format long
syms k1 k01 VV  % z=dφ/dt
for i=1:1:40
    VVstep=0.0002;        %VV代表电极电势φ
    VVfinal=0.0160;
    VV=0.008+VVstep*i
    k1=150*exp(19.462*VV);
    k01=150*exp(-19.462*VV);
    equation_a=k01*200;
    equation_b=-(5*k1+1000+k01*200);
    equation_c=2*5*k1+1000+50*k01;
    equation_d=-5*k1;
    Coefficient=[equation_a equation_b equation_c equation_d]
    temp=roots(Coefficient)
    equation_y01=temp(1)
    equation_x01=(200*equation_y01^2-200*equation_y01+50)/5
    equation_z01=(0.059-VV)/(1.1*10^(-7))-96485*(k1*(1-equation_y01)^2-k01*equation_x01*equation_y01)/(10*10^(-10))
    equation_y02=temp(2)
    equation_x02=(200*equation_y02^2-200*equation_y02+50)/5
    equation_z02=(0.059-VV)/(1.1*10^(-7))-96485*(k1*(1-equation_y02)^2-k01*equation_x02*equation_y02)/(10*10^(-10))
    equation_y03=temp(3)
    equation_x03=(200*equation_y03^2-200*equation_y03+50)/5
    equation_z03=(0.059-VV)/(1.1*10^(-7))-96485*(k1*(1-equation_y03)^2-k01*equation_x03*equation_y03)/(10*10^(-10))
end
回复此楼

» 本帖@通知

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

cooooldog

铁杆木虫 (著名写手)

ส็็็

【答案】应助回帖

★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★
感谢参与,应助指数 +1
309065816: 金币+20 2014-10-25 22:41:09
1. 第一个是正常的现象; eps是实数双精度表示中的一个最小间隔,
http://www.mathworks.cn/help/matlab/ref/eps.html
数值计算,双精度时, 达到 sqrt(eps)的水平通常就已经很漂亮了;
如果想要更高精度, 你用mathematica或maple中的高精度计算就可以了;

2.看代码理解你的问题效率太低了; 你能用数学公式详细描述一下原始问题吗?
ส็็็็็็็็็็็็็็็็็็็็
2楼2014-10-25 18:50:25
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

cooooldog

铁杆木虫 (著名写手)

ส็็็

第二个问题只知道你求一个一元三次方程,找到三个根; y(1:3)
每个根又对于x(1:3), z(1:3)

具体的物理意义是什么? 你想要的图又是什么?
ส็็็็็็็็็็็็็็็็็็็็
3楼2014-10-25 19:00:32
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

cooooldog

铁杆木虫 (著名写手)

ส็็็

如果要的是空间曲线;
把对应的值分别赋给:

y=[y1,y2,y3];
x=[x1,x2,x3];
z=[z1,z2,z3];
然后
plot3(x,y,z)
ส็็็็็็็็็็็็็็็็็็็็
4楼2014-10-25 19:08:24
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

309065816

木虫 (正式写手)

引用回帖:
2楼: Originally posted by cooooldog at 2014-10-25 18:50:25
1. 第一个是正常的现象; eps是实数双精度表示中的一个最小间隔,
http://www.mathworks.cn/help/matlab/ref/eps.html
数值计算,双精度时, 达到 sqrt(eps)的水平通常就已经很漂亮了;
如果想要更高精度, 你用mathem ...

嗯嗯,如果是达到sqrt(eps)这个要求就可以的话,那基本算是符合要求了。把计算结果代回原方程,一般都在10^-14或-13的样子。
确实,代码的效率比较低,具体的公式如下:
eq01=ax^3+bx^2+cx+d
其中,a=k01*k2;
b=-(Diff*k1+Diff*k2+k01*k2);
c=2*Diff*k1+Diff*k2+Diff*Concentration*k01
d=-Diff*k1
k1=150*exp(19.462*VV)
k01=150*exp(-19.462*VV)
x=(k2*y^2-k2*y+Diff*Concentration)/Diff
z=(0.059-VV)/(Resistance*Capacitance)-96485*(k1*(1-y)*(1-y)-k01*x*y)/Capacitance
上面除了k1跟k01随VV变化外,其余的均为已知量。
然后对VV循环赋值,这样就会产生不同的k1跟k01,相应的y值也会变化。这样,就相当于1个VV值可以求得3个根,也对应于有3个x和z。
然后就要对VV~z值作图,可以得到一条S型的曲线。
我自己修改了一下程序,把数据保存,然后导出来用origin作图,已经可以得到一条S型的线。不过跟文献里有些差距,所以在想是否与y的求解精度有关。
5楼2014-10-25 19:14:54
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

309065816

木虫 (正式写手)

引用回帖:
3楼: Originally posted by cooooldog at 2014-10-25 19:00:32
第二个问题只知道你求一个一元三次方程,找到三个根; y(1:3)
每个根又对于x(1:3), z(1:3)

具体的物理意义是什么? 你想要的图又是什么?

我在程序中用z代替dφ/dt,用VV表示φ。最后得到关于φ~dφ/dt图,也即程序中的VV~z。
现在是要重现文献中的图,我的课题方向是电化学振荡,就是要查找能够出现振荡所须满足的要求。
MATLAB中运算过程中的数据保存以及作图
T552F2$P0116SM[P9L5DUVN.jpg

6楼2014-10-25 19:19:25
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

309065816

木虫 (正式写手)

引用回帖:
4楼: Originally posted by cooooldog at 2014-10-25 19:08:24
如果要的是空间曲线;
把对应的值分别赋给:

y=;
x=;
z=;
然后
plot3(x,y,z)

这是我自己做出来的图,把重叠的部分删除以后就跟文献中的比较相似了。
MATLAB中运算过程中的数据保存以及作图-1
G7TOHR4UM~`[XEX$UL6LG8X.jpg


MATLAB中运算过程中的数据保存以及作图-2
@X(X{%2]H{6XGRZ[62R_[4K.jpg

7楼2014-10-25 19:21:50
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

小楼寒

银虫 (小有名气)

【答案】应助回帖

★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★
感谢参与,应助指数 +1
309065816: 金币+40 2014-10-25 22:41:16
第1题.同意楼上
第2题.修改后的代码,不知是不是你所要的结果:
clear
format long
syms k1 k01 VV  % z=dφ/dt
V=[];
z=[];
for j=1:1:40
    VVstep=0.0002;        %VV代表电极电势φ
    VVfinal=0.0160;
    VV=0.008+VVstep*j
    k1=150*exp(19.462*VV);
    k01=150*exp(-19.462*VV);
    equation_a=k01*200;
    equation_b=-(5*k1+1000+k01*200);
    equation_c=2*5*k1+1000+50*k01;
    equation_d=-5*k1;
    Coefficient=[equation_a equation_b equation_c equation_d]
    temp=roots(Coefficient)
    equation_y01=temp(1)
    equation_x01=(200*equation_y01^2-200*equation_y01+50)/5
    equation_z01=(0.059-VV)/(1.1*10^(-7))-96485*(k1*(1-equation_y01)^2-k01*equation_x01*equation_y01)/(10*10^(-10))
    equation_y02=temp(2)
    equation_x02=(200*equation_y02^2-200*equation_y02+50)/5
    equation_z02=(0.059-VV)/(1.1*10^(-7))-96485*(k1*(1-equation_y02)^2-k01*equation_x02*equation_y02)/(10*10^(-10))
    equation_y03=temp(3)
    equation_x03=(200*equation_y03^2-200*equation_y03+50)/5
    equation_z03=(0.059-VV)/(1.1*10^(-7))-96485*(k1*(1-equation_y03)^2-k01*equation_x03*equation_y03)/(10*10^(-10))
    hold on
    V=[V,VV];
    z=[z;equation_z01,equation_z02,equation_z03];
end
plot(V,z)
legend('equation z01','equation z02','equation z03')


后注:
1.代码效率比较低,不容易阅读,变量名太长了点儿;
2.计算后有虚部产生,不知为何,能力有限。请检查算法是否无误
3.记得加分号以抑制中间结果的输出,如果想要输出中间结果最好用disp说明一下,以免阅读混乱;
执着的追求值得的东西
8楼2014-10-25 19:59:33
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

309065816

木虫 (正式写手)

引用回帖:
8楼: Originally posted by 小楼寒 at 2014-10-25 19:59:33
第1题.同意楼上
第2题.修改后的代码,不知是不是你所要的结果:
clear
format long
syms k1 k01 VV  % z=dφ/dt
V=[];
z=[];
for j=1:1:40
    VVstep=0.0002;        %VV代表电极电势φ
    VVfinal=0.01 ...

嗯嗯,谢谢。我的基础比较差,所以编的程序都比较繁琐,按部就班的来。我明天运行一下试试看先。
1、变量名是之前老师有要求过,所以用这种,方便以后辨别。
2、我自己编程过程中也有虚部产生,可能是在运算过程中有-1开平方的存在。也没有办法消除。
3、没有加分号是因为需要中间的一些运算结果,方便后续使用。
9楼2014-10-25 22:34:16
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

cooooldog

铁杆木虫 (著名写手)

ส็็็

【答案】应助回帖

★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★
309065816: 金币+40 2014-10-26 23:20:33
引用回帖:
9楼: Originally posted by 309065816 at 2014-10-25 22:34:16
嗯嗯,谢谢。我的基础比较差,所以编的程序都比较繁琐,按部就班的来。我明天运行一下试试看先。
1、变量名是之前老师有要求过,所以用这种,方便以后辨别。
2、我自己编程过程中也有虚部产生,可能是在运算过程 ...

我在前面的基础上修改了代码;

1. 不需要用syms 定义变量;
2. 不需要用format long, 改用 disp(num2str( x, '%16.8f')) 之类的更好
3. 所谓重叠, 实际是计算中的复数部分, 绘图时候只取了实部,结果有了多余;
去掉这些z中的复数就跟文献一致了;
CODE:
close all
clear all
clc
%format long
%syms k1 k01 VV  % z=dφ/dt
maxiter = 40;
V=zeros(maxiter,1);
z=zeros(maxiter,3);

for jloop=1:1:maxiter
    VVstep=0.0002;        %VV代表电极电势φ
    VVfinal=0.0160;
    VV=0.008+VVstep*jloop;
    k1=150*exp(19.462*VV);
    k01=150*exp(-19.462*VV);
    equation_a=k01*200;
    equation_b=-(5*k1+1000+k01*200);
    equation_c=2*5*k1+1000+50*k01;
    equation_d=-5*k1;
    Coefficient=[equation_a equation_b equation_c equation_d];
    temp=roots(Coefficient);
   
    equation_y01=temp(1);
    equation_x01=(200*equation_y01^2-200*equation_y01+50)/5;
    equation_z01=(0.059-VV)/(1.1*10^(-7))-96485*(k1*(1-equation_y01)^2-k01*equation_x01*equation_y01)/(10*10^(-10));
   
    equation_y02=temp(2);
    equation_x02=(200*equation_y02^2-200*equation_y02+50)/5;
    equation_z02=(0.059-VV)/(1.1*10^(-7))-96485*(k1*(1-equation_y02)^2-k01*equation_x02*equation_y02)/(10*10^(-10));
   
    equation_y03=temp(3);
    equation_x03=(200*equation_y03^2-200*equation_y03+50)/5;
    equation_z03=(0.059-VV)/(1.1*10^(-7))-96485*(k1*(1-equation_y03)^2-k01*equation_x03*equation_y03)/(10*10^(-10));
   
   % hold on
    V(jloop)=VV;
    z(jloop,:)=[equation_z01,equation_z02,equation_z03];
end
disp('Display the four coefficients of cubic polynomial:')
for iloop=1:length(Coefficient)
    disp([num2str(iloop),': ',num2str(Coefficient(iloop),'%20.12f')])
end

% Find real values in z
index01 = find(abs(imag(z(:,1)))<sqrt(eps));
index02 = find(abs(imag(z(:,2)))<sqrt(eps));
index03 = find(abs(imag(z(:,3)))<sqrt(eps));
indices = intersect(intersect(index01,index02),index03);

plot(V(indices),z(indices,:))
legend('equation z01','equation z02','equation z03')

Display the four coefficients of cubic polynomial:
1: 21972.801249555268
2: -23996.794492130808
3: 8541.186797539900
4: -1023.993242575541
ส็็็็็็็็็็็็็็็็็็็็
10楼2014-10-26 08:04:52
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 309065816 的主题更新
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[教师之家] 发现督导在听课,需要跟TA招呼示意吗?有同学看手机、课件有疏漏算大问题吗? +5 河西夜郎 2024-04-19 5/250 2024-04-20 08:46 by tiger_galaxy
[考研] 想问一下有没有需要文章但是没时间带学生的研究生导师。 +9 lekinna 2024-04-19 19/950 2024-04-20 05:35 by charles-c
[论文投稿] 一审一个审稿人,小修,会怎么样呀? +9 林师妹 2024-04-18 9/450 2024-04-19 20:00 by nono2009
[考博] 24/25读博求博导 +4 宝23 2024-04-16 4/200 2024-04-19 17:18 by wangzhe_bs
[考博] 山东大学化学与化工学院刘磊课题组博士研究生招生启事 +3 sdorganic 2024-04-17 5/250 2024-04-19 17:04 by 368ghnf
[基金申请] 基金和生小孩 +33 Ausy 2024-04-15 35/1750 2024-04-19 16:21 by feng6531
[高分子] 聚酰胺650与环氧树脂e44固化 +3 yindingxin 2024-04-15 3/150 2024-04-19 13:55 by weilingdun
[考博] 25申博记录贴 +3 我属驴核动力驴 2024-04-18 4/200 2024-04-19 10:53 by 安塔瓦拉多
[有机交流] 紫外光谱 50+3 54胡 2024-04-17 3/150 2024-04-19 10:48 by Nanamiwww
[基金申请] 国家资助博士后BC档出校后资助的概率多大? +3 卡卡罗特哦 2024-04-16 3/150 2024-04-18 12:58 by wolfgangHugh
[考研] 332求调剂 +3 木叶下1999 2024-04-16 5/250 2024-04-17 00:56 by angeliar
[考研] 浙江海洋大学 船舶与海运学院 交通运输专硕 (交通信息工程及控制)接收调节 +4 joee 2024-04-15 8/400 2024-04-16 20:47 by TommyZiAng
[基金申请] 迟国泰通过向学生发放劳务费再回收的方式套取科学基金重点项目 +6 babu2015 2024-04-13 7/350 2024-04-16 20:32 by sundiv
[考研] 294求调剂 +3 694062003 2024-04-15 4/200 2024-04-16 15:01 by 邹邹哈哈
[考研] 320求调剂 +5 陆志伟 2024-04-15 5/250 2024-04-16 11:11 by 19862091
[考研] 296求调剂 +3 Cclocomotive 2024-04-16 4/200 2024-04-16 10:04 by 19862091
[考研] 334求调剂 +4 学药救人 2024-04-14 4/200 2024-04-15 15:05 by hunanzang
[考研] 273求调剂 +5 Late婉安 2024-04-15 7/350 2024-04-15 13:01 by Late婉安
[考研] 专硕调剂招生 +3 电致发光 2024-04-15 4/200 2024-04-15 07:34 by ashorewmj
[考研] 278求调剂 +4 月亮就蒜 2024-04-13 5/250 2024-04-14 23:03 by 永字号
信息提示
请填处理意见