24小时热门版块排行榜    

查看: 3321  |  回复: 11
【悬赏金币】回答本帖问题,作者ckm0811将赠送您 10 个金币

ckm0811

新虫 (初入文坛)

送红花一朵
引用回帖:
10楼: Originally posted by wlfc at 2021-08-11 16:09:33
使用 3楼、4楼 的公式进行求解。

有两个难点:
1、微分方程求解时要传递中间变量lamb, pa。
2、lambv为未知中间变量,需要求解。
第一个难点对Lu脚本来说不是问题,gsl支持的Lu扩展数学库中求解微分方程的函数 ...

非常感谢,您博客里给出的图形拟合效果很好,我再仔细看一下您的答复
11楼2021-08-16 18:10:56
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

wlfc

新虫 (初入文坛)

【答案】应助回帖

★ ★ ★ ★ ★
独孤神宇: 金币+5, 鼓励交流 2021-08-22 08:43:45
引用回帖:
7楼: Originally posted by wlfc at 2021-08-09 08:09:41
尝试用OpenLu(可从www.forcal.net下载)求解,与大家探讨。
使用 1楼 给出的第一种公式。未知中间变量lambv用解方程法求解,但不知这种方法有没有问题?
仍类似于 4楼 使用部分数据拟合,以减少运行时间。

Lu ...

7楼、8楼、9楼的回复,因理解有误,故重新解答。

仍使用 1楼 给出的第一种公式。仍使用部分数据拟合。

分析:需在微分方程求解中传递中间变量lamb,gsl支持的Lu扩展数学库中求解微分方程的函数gsl_ode提供了传递中间变量的功能。
进一步讨论:微分方程求解传递中间变量时,按时间t的改变量进行插值,可提高求解精度。例如,进行线性插值:lamb=lamb0+(lamb1-lamb0)*[(t-t0)/(t1-t0)]。

另外,微分方程初值lambv未知,将其追加为拟合变量lambv0。

Lu代码:
CODE:
!!!using["luopt","math"]; //使用命名空间

f(  t,lambv,dlambv,i
    : lamb
    : t_A, t_lamb, fac1,fac2,fac3,fac4,fac5,fac6,fac7) =
    lamb=t_lamb[i]+(t_lamb[i+1]-t_lamb[i])*[(t-t_A[i])/(t_A[i+1]-t_A[i])],
    dlambv=((1.0/3/fac7)*(fac1*((lamb/lambv)^fac2-(lambv/lamb)^(0.5*fac2))+fac3*((lamb/lambv)^fac4-(lambv/lamb)^(0.5*fac4))+fac5*((lamb/lambv)^fac6-(lambv/lamb)^(0.5*fac6)))),
    0;  //成功返回0

目标函数(_fac1,_fac2,_fac3,_fac4,_fac5,_fac6,_fac7,lambv0
    : i,s,tf,pa,lamb,lambv
    : t_A, t_lamb, t_pa, t_p, max, fac1,fac2,fac3,fac4,fac5,fac6,fac7)=
{
    fac1=_fac1, fac2=_fac2, fac3=_fac3, fac4=_fac4, fac5=_fac5, fac6=_fac6, fac7=_fac7,  //传递优化变量
    //最后一个参数50表示gsl_ode函数在计算时,最多循环计算50次,这样可以提高速度
    tf=gsl_ode[@f, nil, nil, t_A, ra1(lambv0),  1e-6, 1e-6, gsl_rkf45, 1e-6,50],
    i=-1, s=0, while{++i<max,
        pa=t_pa(i), lamb=t_lamb(i), lambv=tf(i,1),
        s=s+[(pa+fac1*((lamb/lambv)^fac2/lamb-(lambv/lamb)^(fac2*0.5)/lamb)+fac3*((lamb/lambv)^fac4/lamb-(lambv/lamb)^(fac4*0.5)/lamb)+fac5*((lamb/lambv)^fac6/lamb-(lambv/lamb)^(fac6*0.5)/lamb)) - t_p(i)]^2.0
    },
    s
};

main(: tArray : t_A, t_lamb, t_pa, t_p, max)=
{
    tArray=matrix{ //存放实验数据//t,lamb,pa,p
        "0        0.959926667        -0.218715994        -0.060966222
0.25        0.963063333        -0.200840559        -0.046836278
0.5        0.96612        -0.183553472        -0.035042256
0.75        0.969016667        -0.167289626        -0.024438988
1        0.97171        -0.152268899        -0.01706765
1.25        0.97409        -0.139075651        -0.010939712
1.5        0.976123333        -0.127862697        -0.006795087
1.75        0.977786667        -0.118729759        -0.002919842
2        0.979000001        -0.112089924        -0.001981819
2.25        0.979743333        -0.108031322        -0.001163676
2.5        0.98001        -0.106577018        -0.003491456
2.75        0.979766667        -0.107904033        -0.009723697"
    },
    len[tArray,0,&max], t_A=tArray(all:0).reshape(), t_lamb=tArray(all:1).reshape(), t_pa=tArray(all:2).reshape(), t_p=tArray(all:3).reshape(), //用len函数取矩阵的行数,t_A等取矩阵的列
    Opt1[@目标函数,  optwaysimdeep, optwayconfra] //Opt1函数全局优化
};

结果:

7.148976005697928e-003    -14.5708961980305         -1.059296609366114        0.2342635320112431        -9.68049051324744e-005    -31.79361445870142        -2.026215042289879        1.184269268536115         3.55377979903292e-006

绘图代码:
CODE:
!!!using["luopt","math","win"]; //使用命名空间

f(  t,lambv,dlambv,i
    : lamb
    : t_A, t_lamb, fac1,fac2,fac3,fac4,fac5,fac6,fac7) =
    lamb=t_lamb[i]+(t_lamb[i+1]-t_lamb[i])*[(t-t_A[i])/(t_A[i+1]-t_A[i])],
    dlambv=((1.0/3/fac7)*(fac1*((lamb/lambv)^fac2-(lambv/lamb)^(0.5*fac2))+fac3*((lamb/lambv)^fac4-(lambv/lamb)^(0.5*fac4))+fac5*((lamb/lambv)^fac6-(lambv/lamb)^(0.5*fac6)))),
    0;  //成功返回0

get(t_pp,t_lambv, _fac1,_fac2,_fac3,_fac4,_fac5,_fac6,_fac7,lambv0
    : i,tf,pa,lamb,lambv
    : t_A, t_lamb, t_pa, t_p, max, fac1,fac2,fac3,fac4,fac5,fac6,fac7)=
{
    fac1=_fac1, fac2=_fac2, fac3=_fac3, fac4=_fac4, fac5=_fac5, fac6=_fac6, fac7=_fac7,  //传递优化变量
    //最后一个参数50表示gsl_ode函数在计算时,最多循环计算50次,这样可以提高速度
    tf=gsl_ode[@f, nil, nil, t_A, ra1(lambv0),  1e-6, 1e-6, gsl_rkf45, 1e-6,50],
    t_lambv.copy[tf(all,1)],
    i=-1, while{++i<max,
        pa=t_pa(i), lamb=t_lamb(i), lambv=t_lambv(i),
        t_pp[i]=(pa+fac1*((lamb/lambv)^fac2/lamb-(lambv/lamb)^(fac2*0.5)/lamb)+fac3*((lamb/lambv)^fac4/lamb-(lambv/lamb)^(fac4*0.5)/lamb)+fac5*((lamb/lambv)^fac6/lamb-(lambv/lamb)^(fac6*0.5)/lamb))
    }
};

init( main
    :  tArray, tf, i, k, t_pp,t_lambv
    : t_A, t_lamb, t_pa, t_p, max)=
{
    tArray=matrix{ //存放实验数据//t,lamb,pa,p
        "0        0.959926667        -0.218715994        -0.060966222
0.25        0.963063333        -0.200840559        -0.046836278
0.5        0.96612        -0.183553472        -0.035042256
0.75        0.969016667        -0.167289626        -0.024438988
1        0.97171        -0.152268899        -0.01706765
1.25        0.97409        -0.139075651        -0.010939712
1.5        0.976123333        -0.127862697        -0.006795087
1.75        0.977786667        -0.118729759        -0.002919842
2        0.979000001        -0.112089924        -0.001981819
2.25        0.979743333        -0.108031322        -0.001163676
2.5        0.98001        -0.106577018        -0.003491456
2.75        0.979766667        -0.107904033        -0.009723697"
    },
    len[tArray,0,&max], t_A=tArray(all:0).reshape(), t_lamb=tArray(all:1).reshape(), t_pa=tArray(all:2).reshape(), t_p=tArray(all:3).reshape(), //用len函数取矩阵的行数,t_A等取矩阵的列
    t_pp=new[real_s,max], t_lambv=new[real_s,max],

    get[t_pp, t_lambv, 7.148976005697928e-003  ,  -14.5708961980305     ,    -1.059296609366114    ,    0.2342635320112431    ,    -9.68049051324744e-005  ,  -31.79361445870142     ,   -2.026215042289879     ,   1.184269268536115  ],

    cwAttach[typeSplit], cwResizePlots(1,2,2), //左二右二分裂
    k=cwAddCurve{t_A, t_p, max, 0},    //给0子图添加曲线
    cwSetScatter(k,0),                 //设置绘制点
    cwSetDataLineSize(5, k, 0),        //设置点的大小
    cwAddCurve{t_A, t_pp, max, 0},     //给0子图添加曲线
    cwAddCurve{t_A, t_lamb, max, 1},   //给1子图添加曲线
    cwAddCurve{t_A, t_pa, max, 2},     //给2子图添加曲线
    cwAddCurve{t_A, t_lambv, max, 3}   //给3子图添加曲线
};
ChartWnd[@init];

图形参考:https://blog.csdn.net/wlfc/article/details/119830682
12楼2021-08-20 20:33:59
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 ckm0811 的主题更新
不应助 确定回帖应助 (注意:应助才可能被奖励,但不允许灌水,必须填写15个字符以上)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 化学工程085602 305分求调剂 +10 RichLi_ 2026-03-25 10/500 2026-03-26 02:17 by BruceLiu320
[考研] 一志愿中南大学化学学硕0703总分337求调剂 +7 niko- 2026-03-22 7/350 2026-03-25 20:14 by qingfeng258
[考研] 材料与化工 322求调剂 +6 然11 2026-03-19 6/300 2026-03-25 18:37 by haxia
[考研] 一志愿北化315 求调剂 +3 akrrain 2026-03-24 3/150 2026-03-24 19:35 by 了了了了。。
[考研] 0854 考研调剂 招生了!AI 方向 +5 pk3725069 2026-03-19 17/850 2026-03-24 17:30 by zhouxuan..
[考研] 070300化学求调剂 +9 苑豆豆 2026-03-20 9/450 2026-03-24 17:15 by licg0208
[考研] 291求调剂 +3 HanBeiNingZC 2026-03-24 3/150 2026-03-24 16:34 by barlinike
[考博] 申博26年 +4 八6八68 2026-03-19 4/200 2026-03-24 15:49 by 小Ben呵呵
[考研] 276求调剂。有半年电池和半年高分子实习经历 +9 材料学257求调剂 2026-03-23 10/500 2026-03-24 07:36 by wangy0907
[考研] 一志愿山东大学药学学硕求调剂 +3 开开心心没烦恼 2026-03-23 4/200 2026-03-24 00:06 by 开开心心没烦恼
[考研] 环境学硕288求调剂 +8 皮皮皮123456 2026-03-22 8/400 2026-03-23 23:47 by 热情沙漠
[考研] 求老师收我 +3 zzh16938784 2026-03-23 3/150 2026-03-23 12:56 by ztnimte
[考研] 一志愿华中科技大学071000,求调剂 +4 沿岸有贝壳6 2026-03-21 4/200 2026-03-22 07:21 by ilovexiaobin
[考研] 求助 +5 梦里的无言 2026-03-21 6/300 2026-03-21 17:51 by 学员8dgXkO
[考研] 0703化学297求调剂 +3 Daisy☆ 2026-03-20 3/150 2026-03-21 17:45 by ColorlessPI
[考研] 中南大学化学学硕337求调剂 +3 niko- 2026-03-19 6/300 2026-03-20 21:58 by luoyongfeng
[考研] A区线材料学调剂 +5 周周无极 2026-03-20 5/250 2026-03-20 21:33 by laoshidan
[考研] 一志愿西南交通 专硕 材料355 本科双非 求调剂 +5 西南交通专材355 2026-03-19 5/250 2026-03-20 21:10 by JourneyLucky
[考研] 一志愿 南京航空航天大学大学 ,080500材料科学与工程学硕 +5 @taotao 2026-03-20 5/250 2026-03-20 20:16 by JourneyLucky
[考研] 材料学硕318求调剂 +5 February_Feb 2026-03-19 5/250 2026-03-19 23:51 by 23Postgrad
信息提示
请填处理意见