Многомерная кривая соответствует экспериментальным данным - PullRequest
2 голосов
/ 27 июня 2019

Недавно я подошел к новому вызову, с которым мне сложно обойтись.У меня есть ряд кривых, описывающих поведение материала во время пластического формования, и я хотел бы поместить данные в элегантное уравнение степенного закона.Материал чувствителен к скорости деформации, поэтому у меня есть несколько кривых для различных скоростей деформации.Кривые в форме кривых напряжения-деформации.На языке математики:

f(B,C,x,y)=B^x*C^y

Где:

B = Strain,
C = Strain rate,
x = Strain coefficient,
y = Strain rate coefficient.

У меня есть число кривых, описывающих f(B) для различных значений C.

Все, что я до сих пор пробовал, касается линейных функций или одной независимой переменной.

Я также думал о простой функции, принимающей возможные минимальные и максимальные значения x и y,создание матрицы значений по 100 элементов в каждой, а затем вычисление функции для первой комбинации и стандартного отклонения.После этого итеративно переходите от комбинации к комбинации и сравнивайте стандартные отклонения.Выберите комбинацию с наименьшим отклонением в качестве решения.

Другая возможность - использовать fminunc или fminsearch, но я не знаю, как поставить различные кривые в качестве отправной точки.

Можете ли вы помочь мне написать код для поиска x и y?

Я могу предоставить кривые, если это необходимо.Все мои цифры натуральные.

Спасибо

Ответы [ 2 ]

0 голосов
/ 28 июня 2019

Наиболее подходящим решением для меня является использование 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);

Спасибо всем за интерес и помощь.

0 голосов
/ 27 июня 2019

Вы можете технически вывести x и y из одного f (B) для данного C.

[x ylogC]=polyfit(log(B),log(f),1);
y=ylogC/log(C);

Причина в том, что если вы берете логарифм ожидаемой функции, вы получаете:

log (f) = log (B ^ x * C ^ y)

, который уменьшается до:

log (f) = x log (B) + y log (C)

Это линейно по отношению к log (B), поэтому, если вы найдете наклон, вы получите x, а точка пересечения у будет y * log (C).

...