24小时热门版块排行榜    

Znn3bq.jpeg
汕头大学海洋科学接受调剂
查看: 3393  |  回复: 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个字符以上)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 药学305求调剂 +6 玛卡巴卡boom 2026-04-11 6/300 2026-04-14 19:48 by zhouxiaoyu
[考研] 通信工程求调剂!!! +4 zlb770521 2026-04-14 4/200 2026-04-14 18:19 by lbsjt
[考研] 08工学 309分求调剂 +12 Yin DY 2026-04-08 12/600 2026-04-14 17:49 by lhj2009
[考研] 284求调剂 +17 让我上岸吧阿西 2026-04-09 17/850 2026-04-14 14:44 by 不我拉绿卡
[基金申请] RY:中国产出的科学垃圾论文,绝对数量和比例都世界第一 +6 zju2000 2026-04-14 17/850 2026-04-14 14:34 by jurkat.1640
[考研] 生物学调剂 +7 纸扇zhishan 2026-04-13 7/350 2026-04-14 14:21 by jyl0317
[考研] 300分求调剂 (085501机械专硕,本科扬大) +9 xu@841019 2026-04-11 10/500 2026-04-14 08:48 by 木木mumu~
[考研] 一志愿厦大生物学332求调剂 +11 池池池池池池 2026-04-08 11/550 2026-04-13 14:10 by 科研论
[考研] 296求调剂 +14 汪!?! 2026-04-10 16/800 2026-04-12 10:48 by zhouyuwinner
[考研] 085600材料与化工329分求调剂 +16 叶zilin 2026-04-10 16/800 2026-04-11 11:04 by may_新宇
[考研] 0854调剂 +5 音像店听花鼓戏 2026-04-10 5/250 2026-04-11 10:49 by qingpingzhu
[考研] 一志愿985机械学硕380求调剂 +5 关关雎鸠10 2026-04-11 5/250 2026-04-11 10:10 by 知念。A
[考研] 吉大计算机技术331分,英语六级,求调剂 +3 峰峰021116 2026-04-09 3/150 2026-04-10 20:01 by chemisry
[考研] 284求调剂 +9 让我上岸吧阿西 2026-04-09 11/550 2026-04-10 19:18 by 靖jing
[考研] 298求调剂 +13 钉叮咚冬瓜 2026-04-09 13/650 2026-04-10 15:49 by jiajinhpu
[考研] 292求调剂 +9 笑笑袁 2026-04-09 9/450 2026-04-10 10:05 by LHGeng
[考研] 070300化学 求调剂 +13 73372112 2026-04-08 13/650 2026-04-09 20:22 by maddjdld
[考研] 调剂 +12 月@163.com 2026-04-08 12/600 2026-04-09 14:27 by rl1980
[考研] 0860004 求调剂 309分 +6 Yin DY 2026-04-09 6/300 2026-04-09 10:19 by 啊李999
[考研] 软件工程求调剂22软工296分求调剂,接受跨调 +4 yangchen2017 2026-04-08 5/250 2026-04-08 21:56 by 土木硕士招生
信息提示
请填处理意见