多元曲线拟合实验数据
Multivariate curve fit to experimental data
最近我遇到了工作困难的新挑战
大约。
我有许多曲线描述 material 塑料成型过程中的行为
并希望将数据放入优雅的幂律方程中。
material 对应变率敏感,所以我的曲线很少
对于各种应变率。
这些曲线是应力-应变曲线的形式。
用数学语言:
f(B,C,x,y)=B^x*C^y
其中:
B = Strain,
C = Strain rate,
x = Strain coefficient,
y = Strain rate coefficient.
对于 C
的各种值,我有许多描述 f(B)
的曲线。
到目前为止我所尝试的一切都是关于线性函数或单函数
自变量。
我也考虑过简单的函数取 x
和 y
可能的最小值和最大值,创建每个值有 100 个元素的矩阵,然后计算第一个组合的函数和标准偏差。之后,从组合迭代到组合并比较标准差。 Select偏差最小的组合作为解。
另一种可能是使用 fminunc
或 fminsearch
但我不知道如何将各种曲线作为起点。
你能帮我写代码找到 x
和 y
吗?
如果需要我可以提供曲线。我所有的数字都是自然的。
谢谢
从技术上讲,对于给定的 C,您可以从单个 f(B) 导出 x 和 y。
[x ylogC]=polyfit(log(B),log(f),1);
y=ylogC/log(C);
原因是,如果您对预期函数取对数,您会得到:
log(f)=log(B^x * C^y)
减少为:
log(f)=xlog(B) + ylog(C)
这是关于 log(B) 的线性关系,因此如果您找到斜率,您将得到 x,而 y 截距将为 y*log(C)。
最适合我的解决方案是使用nlinfit
。算法示例:
betaWithoutNoise = [80;0.3;0.1]; # True values of our parameters
x=[0:0.1:1];
x21(1:11)=0.01;
x22(1:11)=0.1;
xmatrix=[[x;x21],[x;x22]];
realValues=betaWithoutNoise(1)*(xmatrix(1,:).^betaWithoutNoise(2)).*(xmatrix(2,:).^betaWithoutNoise(3))
#adding noise to the function values
noise=rand(size(realValues))-0.5;
noisyValues=realValues+noise;
#application of function model
modelfun=@(b,xmatrix) (b(1)*(xmatrix(1,:).^(b(2))).*(xmatrix(2,:).^b(3)));
beta0=[70,0.1,0.3];
[beta,R,J,covb,mse]=nlinfit(xmatrix,noisyValues,modelfun,beta0);
感谢大家的关心和帮助。
最近我遇到了工作困难的新挑战 大约。 我有许多曲线描述 material 塑料成型过程中的行为 并希望将数据放入优雅的幂律方程中。 material 对应变率敏感,所以我的曲线很少 对于各种应变率。 这些曲线是应力-应变曲线的形式。 用数学语言:
f(B,C,x,y)=B^x*C^y
其中:
B = Strain,
C = Strain rate,
x = Strain coefficient,
y = Strain rate coefficient.
对于 C
的各种值,我有许多描述 f(B)
的曲线。
到目前为止我所尝试的一切都是关于线性函数或单函数 自变量。
我也考虑过简单的函数取 x
和 y
可能的最小值和最大值,创建每个值有 100 个元素的矩阵,然后计算第一个组合的函数和标准偏差。之后,从组合迭代到组合并比较标准差。 Select偏差最小的组合作为解。
另一种可能是使用 fminunc
或 fminsearch
但我不知道如何将各种曲线作为起点。
你能帮我写代码找到 x
和 y
吗?
如果需要我可以提供曲线。我所有的数字都是自然的。
谢谢
从技术上讲,对于给定的 C,您可以从单个 f(B) 导出 x 和 y。
[x ylogC]=polyfit(log(B),log(f),1);
y=ylogC/log(C);
原因是,如果您对预期函数取对数,您会得到:
log(f)=log(B^x * C^y)
减少为:
log(f)=xlog(B) + ylog(C)
这是关于 log(B) 的线性关系,因此如果您找到斜率,您将得到 x,而 y 截距将为 y*log(C)。
最适合我的解决方案是使用nlinfit
。算法示例:
betaWithoutNoise = [80;0.3;0.1]; # True values of our parameters
x=[0:0.1:1];
x21(1:11)=0.01;
x22(1:11)=0.1;
xmatrix=[[x;x21],[x;x22]];
realValues=betaWithoutNoise(1)*(xmatrix(1,:).^betaWithoutNoise(2)).*(xmatrix(2,:).^betaWithoutNoise(3))
#adding noise to the function values
noise=rand(size(realValues))-0.5;
noisyValues=realValues+noise;
#application of function model
modelfun=@(b,xmatrix) (b(1)*(xmatrix(1,:).^(b(2))).*(xmatrix(2,:).^b(3)));
beta0=[70,0.1,0.3];
[beta,R,J,covb,mse]=nlinfit(xmatrix,noisyValues,modelfun,beta0);
感谢大家的关心和帮助。