[已解决] 新手求教,怎么简化这个程序呢?

[复制链接]
付梓轩 发表于 4 天前
这个计算包含了一个积分,积分中有一个变量yita。最后要得到zT和函数中变量的关系。但是这个跑起来很慢,要怎么改才好呢?我一开始用的是矩阵做的,但是也不是很快,后来被老师说一开始可以不用矩阵来算,于是就用了for循环。
clear
syms i x
beta = [0.5 1 2 4 10 20 50 100]
yita = -15:10
h = 6.62607015*10^(-34)
kB = 1.380649*10^(-23)
m = 9.109*10^(-31)
fun(i) = x^i./(1+exp(x-yita))
F(i) = int(fun(i),0,100)%费米狄拉克积分
S = 2*F(1)./F(0)-yita
L = 3*F(2)./F(0)-(2*F(1)./F(0)).^2

k1 = 4*pi*h^(-3)*(2*m*kB*300)^1.5
n = k1*F(0.5)
%计算载流子浓度

zT = ones(length(beta),length(yita))
for index = 1:8
    zT(index,:) = S.^2./(L+(F(0.5)*beta(index)).^(-1))
end
%计算zT

plot(log10(n), zT)
plot(yita, zT)

最佳答案


TouAkira 发表于 4 天前
一般而言,复杂积分不建议用 符号积分int函数(超链接,自己点进去看) 求。求符号解会非常慢,而且相当一部分积分本身就没有符号解,实际上还要转为数值方法。
能求出符号解的复杂积分是极少数,相当大一部分的工程或科研中遇到的复杂积分,是求不出符号解的,往往只能使用数值方法逼近(全部参数都代入具体数值,使用数值求解器 数值积分integral函数(超链接,自己点进去看)  或 数值积分trapz函数(超链接,自己点进去看) 等数值方法求解)。

此外,既然已经明确知道打算求解“费米狄拉克积分”,那么按关键词到官网和搜索,会更有效率。不太冷门的许多函数,都有热心用户提供写好的第三方代码,比如《 Half-order Fermi-Dirac integral(超链接,自己点进去看) 》,这块我不懂,你需要自己看看他提供的代码是否符合需要。另有如
  1. github.com/wang159/FDIntegral_Table
复制代码

等网站,也有人提供实现某些数值算法的代码。
回复此楼

2 条回复


TouAkira 发表于 4 天前
一般而言,复杂积分不建议用 符号积分int函数(超链接,自己点进去看) 求。求符号解会非常慢,而且相当一部分积分本身就没有符号解,实际上还要转为数值方法。
能求出符号解的复杂积分是极少数,相当大一部分的工程或科研中遇到的复杂积分,是求不出符号解的,往往只能使用数值方法逼近(全部参数都代入具体数值,使用数值求解器 数值积分integral函数(超链接,自己点进去看)  或 数值积分trapz函数(超链接,自己点进去看) 等数值方法求解)。

此外,既然已经明确知道打算求解“费米狄拉克积分”,那么按关键词到官网和搜索,会更有效率。不太冷门的许多函数,都有热心用户提供写好的第三方代码,比如《 Half-order Fermi-Dirac integral(超链接,自己点进去看) 》,这块我不懂,你需要自己看看他提供的代码是否符合需要。另有如
  1. github.com/wang159/FDIntegral_Table
复制代码

等网站,也有人提供实现某些数值算法的代码。
回复此楼

付梓轩 发表于 4 天前
TouAkira 发表于 2022-9-22 11:44
一般而言,复杂积分不建议用 符号积分int函数(超链接,自己点进去看) 求。求符号解会非常慢,而且相当一 ...

感谢大神!!!!用了integral函数,速度得到了质变,一下子就画出来了图像
您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
相关文章
热门教程
站长推荐
快速回复 返回顶部 返回列表